Tool/software: TI C/C++ Compiler
There seems to be a small hole in the type checking whereby using the max() macro (from the gcc Typeof docs) results in a remark about signed/unsigned comparison. Only line 51 is flagged.
#include <stdint.h> #define max(a,b) \ ({ __typeof__ (a) _a = (a); \ __typeof__ (b) _b = (b); \ _a > _b ? _a : _b; }) typedef enum { AE0 = 0, AE1 = 1 } AnonymousEnumeration_t; typedef enum NamedEnumeration_e { NE0, NE1 } NamedEnumeration_t; enum PostNamedEnumeration_e { PNE0, PNE1 }; typedef enum PostNamedEnumeration_e PostNamedEnumeration_t; AnonymousEnumeration_t AEa[3] = {}; int f() { uint16_t x = 5; __typeof__(x) y = x; __typeof__(x) z = max(x, y); AnonymousEnumeration_t a = max(AE0, AE0); AnonymousEnumeration_t b = max(AE0, AE1); AnonymousEnumeration_t c = max(AE0, AE0); __typeof__(c) d = max(AE0, AE1); AnonymousEnumeration_t e = AE0; __typeof__(e) f = e; __typeof__(e) g = max(e, f); AnonymousEnumeration_t h = max(AEa[0], AEa[1]); AnonymousEnumeration_t i = AE1; AnonymousEnumeration_t j = max(i, AEa[1]); // /opt/ti/ccsv8/tools/compiler/ti-cgt-c2000_18.1.2.LTS/bin/cl2000 --include_path='/opt/ti/ccsv8/tools/compiler/ti-cgt-c2000_18.1.2.LTS/include' --issue_remarks --display_error_number test.c // "test.c", line 51: remark #2142-D: comparison between signed and unsigned operands AnonymousEnumeration_t k = max(AE1, AEa[1]); __typeof__(AEa[1]) l = AEa[1]; AnonymousEnumeration_t m = max(l, AEa[1]); return x + y + z + a + b + c + d + e + f + g + h + i + j + k + l + m; }
(edit: Sorry, the original file above was a mixed run with the 18.1.2 compiler but the 18.1.1 include path. From what I saw it was the same in both 18.1.1 and 18.1.2. For completeness, I have updated it to be a copy run with 18.1.2 compiler and include path.)