brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.1 KiB · 51918da Raw
248 lines · c
1// RUN: %clang_cc1 -fsyntax-only -fno-diagnostics-show-line-numbers %s 2>&1 | FileCheck %s -strict-whitespace2 3#define M1(x) x4#define M2 1;5void foo(void) {6  M1(7    M2);8  // CHECK: {{.*}}:7:{{[0-9]+}}: warning: expression result unused9  // CHECK: {{.*}}:4:{{[0-9]+}}: note: expanded from macro 'M2'10  // CHECK: {{.*}}:3:{{[0-9]+}}: note: expanded from macro 'M1'11}12 13#define A(x) x14#define B(x) A(x)15#define C(x) B(x)16void bar(void) {17  C(1);18  // CHECK: {{.*}}:17:5: warning: expression result unused19}20 21#define sprintf(str, A, B) \22__builtin___sprintf_chk (str, 0, 42, A, B)23 24void baz(char *Msg) {25  sprintf(Msg,  "  sizeof FoooLib            : =%3u\n",   12LL);26}27 28 29// PR9279: comprehensive tests for multi-level macro back traces30#define macro_args1(x) x31#define macro_args2(x) macro_args1(x)32#define macro_args3(x) macro_args2(x)33 34#define macro_many_args1(x, y, z) y35#define macro_many_args2(x, y, z) macro_many_args1(x, y, z)36#define macro_many_args3(x, y, z) macro_many_args2(x, y, z)37 38void test(void) {39  macro_args3(11);40  // CHECK: {{.*}}:39:15: warning: expression result unused41  // Also check that the 'caret' printing agrees with the location here where42  // its easy to FileCheck.43  // CHECK-NEXT:      macro_args3(11);44  // CHECK-NEXT: {{^              \^~}}45 46  macro_many_args3(47    1,48    2,49    3);50  // CHECK: {{.*}}:48:5: warning: expression result unused51  // CHECK: {{.*}}:36:55: note: expanded from macro 'macro_many_args3'52  // CHECK: {{.*}}:35:55: note: expanded from macro 'macro_many_args2'53  // CHECK: {{.*}}:34:35: note: expanded from macro 'macro_many_args1'54 55  macro_many_args3(56    1,57    M2,58    3);59  // CHECK: {{.*}}:57:5: warning: expression result unused60  // CHECK: {{.*}}:4:12: note: expanded from macro 'M2'61  // CHECK: {{.*}}:36:55: note: expanded from macro 'macro_many_args3'62  // CHECK: {{.*}}:35:55: note: expanded from macro 'macro_many_args2'63  // CHECK: {{.*}}:34:35: note: expanded from macro 'macro_many_args1'64 65  macro_many_args3(66    1,67    macro_args2(22),68    3);69  // CHECK: {{.*}}:67:17: warning: expression result unused70  // This caret location needs to be printed *inside* a different macro's71  // arguments.72  // CHECK-NEXT:        macro_args2(22),73  // CHECK-NEXT: {{^                \^~}}74  // CHECK: {{.*}}:31:36: note: expanded from macro 'macro_args2'75  // CHECK: {{.*}}:30:24: note: expanded from macro 'macro_args1'76  // CHECK: {{.*}}:36:55: note: expanded from macro 'macro_many_args3'77  // CHECK: {{.*}}:35:55: note: expanded from macro 'macro_many_args2'78  // CHECK: {{.*}}:34:35: note: expanded from macro 'macro_many_args1'79}80 81#define variadic_args1(x, y, ...) y82#define variadic_args2(x, ...) variadic_args1(x, __VA_ARGS__)83#define variadic_args3(x, y, ...) variadic_args2(x, y, __VA_ARGS__)84 85void test2(void) {86  variadic_args3(1, 22, 3, 4);87  // CHECK: {{.*}}:86:21: warning: expression result unused88  // CHECK-NEXT:      variadic_args3(1, 22, 3, 4);89  // CHECK-NEXT: {{^                    \^~}}90  // CHECK: {{.*}}:83:53: note: expanded from macro 'variadic_args3'91  // CHECK: {{.*}}:82:50: note: expanded from macro 'variadic_args2'92  // CHECK: {{.*}}:81:35: note: expanded from macro 'variadic_args1'93}94 95#define variadic_pasting_args1(x, y, z) y96#define variadic_pasting_args2(x, ...) variadic_pasting_args1(x ## __VA_ARGS__)97#define variadic_pasting_args2a(x, y, ...) variadic_pasting_args1(x, y ## __VA_ARGS__)98#define variadic_pasting_args3(x, y, ...) variadic_pasting_args2(x, y, __VA_ARGS__)99#define variadic_pasting_args3a(x, y, ...) variadic_pasting_args2a(x, y, __VA_ARGS__)100 101void test3(void) {102  variadic_pasting_args3(1, 2, 3, 4);103  // CHECK: {{.*}}:102:32: warning: expression result unused104  // CHECK: {{.*}}:98:72: note: expanded from macro 'variadic_pasting_args3'105  // CHECK: {{.*}}:96:68: note: expanded from macro 'variadic_pasting_args2'106  // CHECK: {{.*}}:95:41: note: expanded from macro 'variadic_pasting_args1'107 108  variadic_pasting_args3a(1, 2, 3, 4);109  // CHECK:        {{.*}}:108:3: warning: expression result unused110  // CHECK-NEXT:     variadic_pasting_args3a(1, 2, 3, 4);111  // CHECK-NEXT: {{  \^~~~~~~~~~~~~~~~~~~~~~~}}112  // CHECK:        {{.*}}:99:44: note: expanded from macro 'variadic_pasting_args3a'113  // CHECK-NEXT:   #define variadic_pasting_args3a(x, y, ...) variadic_pasting_args2a(x, y, __VA_ARGS__)114  // CHECK-NEXT: {{                                           \^~~~~~~~~~~~~~~~~~~~~~~}}115  // CHECK:        {{.*}}:97:70: note: expanded from macro 'variadic_pasting_args2a'116  // CHECK-NEXT:   #define variadic_pasting_args2a(x, y, ...) variadic_pasting_args1(x, y ## __VA_ARGS__)117  // CHECK-NEXT: {{                                                                     \^~~~~~~~~~~~~~~~}}118  // CHECK:        {{.*}}:95:41: note: expanded from macro 'variadic_pasting_args1'119  // CHECK-NEXT:   #define variadic_pasting_args1(x, y, z) y120  // CHECK-NEXT: {{                                        \^}}121}122 123#define BAD_CONDITIONAL_OPERATOR (2<3)?2:3124int test4 = BAD_CONDITIONAL_OPERATOR+BAD_CONDITIONAL_OPERATOR;125// CHECK:         {{.*}}:123:39: note: expanded from macro 'BAD_CONDITIONAL_OPERATOR'126// CHECK-NEXT:    #define BAD_CONDITIONAL_OPERATOR (2<3)?2:3127// CHECK-NEXT: {{^                                      \^}}128// CHECK:         {{.*}}:123:39: note: expanded from macro 'BAD_CONDITIONAL_OPERATOR'129// CHECK-NEXT:    #define BAD_CONDITIONAL_OPERATOR (2<3)?2:3130// CHECK-NEXT: {{^                                      \^}}131// CHECK:         {{.*}}:123:39: note: expanded from macro 'BAD_CONDITIONAL_OPERATOR'132// CHECK-NEXT:    #define BAD_CONDITIONAL_OPERATOR (2<3)?2:3133// CHECK-NEXT: {{^                                 ~~~~~\^~~~}}134 135#define QMARK ?136#define TWOL (2<137#define X 1+TWOL 3) QMARK 4:5138int x = X;139// CHECK:         {{.*}}:138:9: note: place parentheses around the '+' expression to silence this warning140// CHECK-NEXT:    int x = X;141// CHECK-NEXT: {{^        \^}}142// CHECK-NEXT:    {{.*}}:137:21: note: expanded from macro 'X'143// CHECK-NEXT:    #define X 1+TWOL 3) QMARK 4:5144// CHECK-NEXT: {{^          ~~~~~~~~~ \^}}145// CHECK-NEXT:    {{.*}}:135:15: note: expanded from macro 'QMARK'146// CHECK-NEXT:    #define QMARK ?147// CHECK-NEXT: {{^              \^}}148// CHECK-NEXT:    {{.*}}:138:9: note: place parentheses around the '?:' expression to evaluate it first149// CHECK-NEXT:    int x = X;150// CHECK-NEXT: {{^        \^}}151// CHECK-NEXT:    {{.*}}:137:21: note: expanded from macro 'X'152// CHECK-NEXT:    #define X 1+TWOL 3) QMARK 4:5153// CHECK-NEXT: {{^            ~~~~~~~~\^~~~~~~~~}}154 155#define ONEPLUS 1+156#define Y ONEPLUS (2<3) QMARK 4:5157int y = Y;158// CHECK:         {{.*}}:157:9: warning: operator '?:' has lower precedence than '+'; '+' will be evaluated first159// CHECK-NEXT:    int y = Y;160// CHECK-NEXT: {{^        \^}}161// CHECK-NEXT:    {{.*}}:156:25: note: expanded from macro 'Y'162// CHECK-NEXT:    #define Y ONEPLUS (2<3) QMARK 4:5163// CHECK-NEXT: {{^          ~~~~~~~~~~~~~ \^}}164// CHECK-NEXT:    {{.*}}:135:15: note: expanded from macro 'QMARK'165// CHECK-NEXT:    #define QMARK ?166// CHECK-NEXT: {{^              \^}}167 168// PR14399169void iequals(int,int,int);170void foo_aa(char* s)171{172#define /* */ BARC(c, /* */b, a) (a + b ? c : c)173  iequals(__LINE__, BARC(123, (456 < 345), 789), 8);174}175// CHECK:         {{.*}}:173:21: warning: operator '?:' has lower precedence than '+'176// CHECK-NEXT:      iequals(__LINE__, BARC(123, (456 < 345), 789), 8);177// CHECK-NEXT: {{^                    \^~~~~~~~~~~~~~~~~~~~~~~~~~~}}178// CHECK-NEXT:    {{.*}}:172:41: note: expanded from macro 'BARC'179// CHECK-NEXT:    #define /* */ BARC(c, /* */b, a) (a + b ? c : c)180// CHECK-NEXT: {{^                                  ~~~~~ \^}}181 182#define APPEND2(NUM, SUFF) -1 != NUM ## SUFF183#define APPEND(NUM, SUFF) APPEND2(NUM, SUFF)184#define UTARG_MAX_U APPEND (MAX_UINT, UL)185#define MAX_UINT 18446744073709551615186#if UTARG_MAX_U187#endif188 189// CHECK:         {{.*}}:186:5: warning: left side of operator converted from negative value to unsigned: -1 to 18446744073709551615190// CHECK-NEXT:    #if UTARG_MAX_U191// CHECK-NEXT: {{^    \^~~~~~~~~~~}}192// CHECK-NEXT:    {{.*}}:184:21: note: expanded from macro 'UTARG_MAX_U'193// CHECK-NEXT:    #define UTARG_MAX_U APPEND (MAX_UINT, UL)194// CHECK-NEXT: {{^                    \^~~~~~~~~~~~~~~~~~~~~}}195// CHECK-NEXT:    {{.*}}:183:27: note: expanded from macro 'APPEND'196// CHECK-NEXT:    #define APPEND(NUM, SUFF) APPEND2(NUM, SUFF)197// CHECK-NEXT: {{^                          \^~~~~~~~~~~~~~~~~~}}198// CHECK-NEXT:    {{.*}}:182:31: note: expanded from macro 'APPEND2'199// CHECK-NEXT:    #define APPEND2(NUM, SUFF) -1 != NUM ## SUFF200// CHECK-NEXT: {{^                           ~~ \^  ~~~~~~~~~~~}}201 202unsigned long strlen_test(const char *s);203#define __darwin_obsz(object) __builtin_object_size (object, 1)204#define sprintf2(str, ...) \205  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)206#define Cstrlen(a)  strlen_test(a)207#define Csprintf    sprintf2208void f(char* pMsgBuf, char* pKeepBuf) {209Csprintf(pMsgBuf,"\nEnter minimum anagram length (2-%1d): ", strlen_test(pKeepBuf));210// FIXME: Change test to use 'Cstrlen' instead of 'strlen_test' when macro printing is fixed.211}212// CHECK:         {{.*}}:209:62: warning: format specifies type 'int' but the argument has type 'unsigned long'213// CHECK-NEXT:    Csprintf(pMsgBuf,"\nEnter minimum anagram length (2-%1d): ", strlen_test(pKeepBuf));214// CHECK-NEXT: {{^                                                    ~~~      \^~~~~~~~~~~~~~~~~~~~~}}215// CHECK-NEXT: {{^                                                    %1lu}}216// CHECK-NEXT:    {{.*}}:207:21: note: expanded from macro 'Csprintf'217// CHECK-NEXT:    #define Csprintf    sprintf2218// CHECK-NEXT: {{^                    \^}}219// CHECK-NEXT:    {{.*}}:205:56: note: expanded from macro 'sprintf2'220// CHECK-NEXT:      __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)221// CHECK-NEXT: {{^                                                       \^~~~~~~~~~~}}222 223#define SWAP_AND_APPLY(arg, macro) macro arg224#define APPLY(macro, arg) macro arg225#define DECLARE_HELPER() __builtin_printf("%d\n", mylong);226void use_evil_macros(long mylong) {227  SWAP_AND_APPLY((), DECLARE_HELPER)228  APPLY(DECLARE_HELPER, ())229}230// CHECK:      {{.*}}:227:22: warning: format specifies type 'int' but the argument has type 'long'231// CHECK-NEXT:   SWAP_AND_APPLY((), DECLARE_HELPER)232// CHECK-NEXT:   ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~233// CHECK-NEXT: {{.*}}:223:36: note: expanded from macro 'SWAP_AND_APPLY'234// CHECK-NEXT: #define SWAP_AND_APPLY(arg, macro) macro arg235// CHECK-NEXT:                                    ^~~~~~~~~236// CHECK-NEXT: {{.*}}:225:51: note: expanded from macro 'DECLARE_HELPER'237// CHECK-NEXT: #define DECLARE_HELPER() __builtin_printf("%d\n", mylong);238// CHECK-NEXT:                                            ~~     ^~~~~~239// CHECK-NEXT: {{.*}}:228:9: warning: format specifies type 'int' but the argument has type 'long'240// CHECK-NEXT:   APPLY(DECLARE_HELPER, ())241// CHECK-NEXT:   ~~~~~~^~~~~~~~~~~~~~~~~~~242// CHECK-NEXT: {{.*}}:224:27: note: expanded from macro 'APPLY'243// CHECK-NEXT: #define APPLY(macro, arg) macro arg244// CHECK-NEXT:                           ^~~~~~~~~245// CHECK-NEXT: {{.*}}:225:51: note: expanded from macro 'DECLARE_HELPER'246// CHECK-NEXT: #define DECLARE_HELPER() __builtin_printf("%d\n", mylong);247// CHECK-NEXT:                                            ~~     ^~~~~~248