| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck %s -strict-whitespace | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 2 |  | 
|  | 3 | #define M1(x) x | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 4 | #define M2 1; | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 5 | void foo() { | 
| Chandler Carruth | 1b7cc20 | 2011-03-09 10:56:54 +0000 | [diff] [blame] | 6 | M1( | 
|  | 7 | M2); | 
| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 8 | // CHECK: {{.*}}:7:{{[0-9]+}}: warning: expression result unused | 
|  | 9 | // CHECK: {{.*}}:4:{{[0-9]+}}: note: expanded from macro 'M2' | 
|  | 10 | // CHECK: {{.*}}:3:{{[0-9]+}}: note: expanded from macro 'M1' | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 11 | } | 
|  | 12 |  | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 13 | #define A 1 | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 14 | #define B A | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 15 | #define C B | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 16 | void bar() { | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 17 | C; | 
| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 18 | // CHECK: {{.*}}:17:3: warning: expression result unused | 
|  | 19 | // CHECK: {{.*}}:15:11: note: expanded from macro 'C' | 
|  | 20 | // CHECK: {{.*}}:14:11: note: expanded from macro 'B' | 
|  | 21 | // CHECK: {{.*}}:13:11: note: expanded from macro 'A' | 
| Chris Lattner | c45529b | 2009-05-05 22:03:18 +0000 | [diff] [blame] | 22 | } | 
|  | 23 |  | 
| Chris Lattner | 5647d31 | 2010-02-12 19:31:35 +0000 | [diff] [blame] | 24 | // rdar://7597492 | 
|  | 25 | #define sprintf(str, A, B) \ | 
|  | 26 | __builtin___sprintf_chk (str, 0, 42, A, B) | 
|  | 27 |  | 
|  | 28 | void baz(char *Msg) { | 
|  | 29 | sprintf(Msg,  "  sizeof FoooLib            : =%3u\n",   12LL); | 
|  | 30 | } | 
|  | 31 |  | 
| Chris Lattner | ac57f21 | 2011-06-28 05:11:33 +0000 | [diff] [blame] | 32 |  | 
| Chandler Carruth | 402bb38 | 2011-07-07 23:56:36 +0000 | [diff] [blame] | 33 | // PR9279: comprehensive tests for multi-level macro back traces | 
|  | 34 | #define macro_args1(x) x | 
|  | 35 | #define macro_args2(x) macro_args1(x) | 
|  | 36 | #define macro_args3(x) macro_args2(x) | 
| Chris Lattner | ac57f21 | 2011-06-28 05:11:33 +0000 | [diff] [blame] | 37 |  | 
| Chandler Carruth | 402bb38 | 2011-07-07 23:56:36 +0000 | [diff] [blame] | 38 | #define macro_many_args1(x, y, z) y | 
|  | 39 | #define macro_many_args2(x, y, z) macro_many_args1(x, y, z) | 
|  | 40 | #define macro_many_args3(x, y, z) macro_many_args2(x, y, z) | 
| Chris Lattner | ac57f21 | 2011-06-28 05:11:33 +0000 | [diff] [blame] | 41 |  | 
| Chandler Carruth | 402bb38 | 2011-07-07 23:56:36 +0000 | [diff] [blame] | 42 | void test() { | 
| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 43 | macro_args3(11); | 
| Chandler Carruth | 402bb38 | 2011-07-07 23:56:36 +0000 | [diff] [blame] | 44 | // CHECK: {{.*}}:43:15: warning: expression result unused | 
|  | 45 | // Also check that the 'caret' printing agrees with the location here where | 
|  | 46 | // its easy to FileCheck. | 
| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 47 | // CHECK-NEXT:      macro_args3(11); | 
|  | 48 | // CHECK-NEXT: {{^              \^~}} | 
| Chandler Carruth | 8c43e66 | 2011-10-24 18:51:08 +0000 | [diff] [blame] | 49 | // CHECK: {{.*}}:36:36: note: expanded from macro 'macro_args3' | 
|  | 50 | // CHECK: {{.*}}:35:36: note: expanded from macro 'macro_args2' | 
|  | 51 | // CHECK: {{.*}}:34:24: note: expanded from macro 'macro_args1' | 
| Chandler Carruth | 402bb38 | 2011-07-07 23:56:36 +0000 | [diff] [blame] | 52 |  | 
|  | 53 | macro_many_args3( | 
|  | 54 | 1, | 
|  | 55 | 2, | 
|  | 56 | 3); | 
|  | 57 | // CHECK: {{.*}}:55:5: warning: expression result unused | 
| Chandler Carruth | 8c43e66 | 2011-10-24 18:51:08 +0000 | [diff] [blame] | 58 | // CHECK: {{.*}}:40:55: note: expanded from macro 'macro_many_args3' | 
|  | 59 | // CHECK: {{.*}}:39:55: note: expanded from macro 'macro_many_args2' | 
|  | 60 | // CHECK: {{.*}}:38:35: note: expanded from macro 'macro_many_args1' | 
| Chandler Carruth | 402bb38 | 2011-07-07 23:56:36 +0000 | [diff] [blame] | 61 |  | 
|  | 62 | macro_many_args3( | 
|  | 63 | 1, | 
|  | 64 | M2, | 
|  | 65 | 3); | 
|  | 66 | // CHECK: {{.*}}:64:5: warning: expression result unused | 
| Chandler Carruth | 8c43e66 | 2011-10-24 18:51:08 +0000 | [diff] [blame] | 67 | // CHECK: {{.*}}:4:12: note: expanded from macro 'M2' | 
|  | 68 | // CHECK: {{.*}}:40:55: note: expanded from macro 'macro_many_args3' | 
|  | 69 | // CHECK: {{.*}}:39:55: note: expanded from macro 'macro_many_args2' | 
|  | 70 | // CHECK: {{.*}}:38:35: note: expanded from macro 'macro_many_args1' | 
| Chandler Carruth | 402bb38 | 2011-07-07 23:56:36 +0000 | [diff] [blame] | 71 |  | 
|  | 72 | macro_many_args3( | 
|  | 73 | 1, | 
| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 74 | macro_args2(22), | 
| Chandler Carruth | 402bb38 | 2011-07-07 23:56:36 +0000 | [diff] [blame] | 75 | 3); | 
|  | 76 | // CHECK: {{.*}}:74:17: warning: expression result unused | 
|  | 77 | // This caret location needs to be printed *inside* a different macro's | 
|  | 78 | // arguments. | 
| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 79 | // CHECK-NEXT:        macro_args2(22), | 
|  | 80 | // CHECK-NEXT: {{^                \^~}} | 
| Chandler Carruth | 8c43e66 | 2011-10-24 18:51:08 +0000 | [diff] [blame] | 81 | // CHECK: {{.*}}:35:36: note: expanded from macro 'macro_args2' | 
|  | 82 | // CHECK: {{.*}}:34:24: note: expanded from macro 'macro_args1' | 
|  | 83 | // CHECK: {{.*}}:40:55: note: expanded from macro 'macro_many_args3' | 
|  | 84 | // CHECK: {{.*}}:39:55: note: expanded from macro 'macro_many_args2' | 
|  | 85 | // CHECK: {{.*}}:38:35: note: expanded from macro 'macro_many_args1' | 
| Chandler Carruth | 402bb38 | 2011-07-07 23:56:36 +0000 | [diff] [blame] | 86 | } | 
| Chandler Carruth | 2536c07 | 2011-07-08 01:04:21 +0000 | [diff] [blame] | 87 |  | 
|  | 88 | #define variadic_args1(x, y, ...) y | 
|  | 89 | #define variadic_args2(x, ...) variadic_args1(x, __VA_ARGS__) | 
|  | 90 | #define variadic_args3(x, y, ...) variadic_args2(x, y, __VA_ARGS__) | 
|  | 91 |  | 
|  | 92 | void test2() { | 
| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 93 | variadic_args3(1, 22, 3, 4); | 
| Chandler Carruth | 2536c07 | 2011-07-08 01:04:21 +0000 | [diff] [blame] | 94 | // CHECK: {{.*}}:93:21: warning: expression result unused | 
| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 95 | // CHECK-NEXT:      variadic_args3(1, 22, 3, 4); | 
|  | 96 | // CHECK-NEXT: {{^                    \^~}} | 
| Chandler Carruth | 8c43e66 | 2011-10-24 18:51:08 +0000 | [diff] [blame] | 97 | // CHECK: {{.*}}:90:53: note: expanded from macro 'variadic_args3' | 
|  | 98 | // CHECK: {{.*}}:89:50: note: expanded from macro 'variadic_args2' | 
|  | 99 | // CHECK: {{.*}}:88:35: note: expanded from macro 'variadic_args1' | 
| Chandler Carruth | 2536c07 | 2011-07-08 01:04:21 +0000 | [diff] [blame] | 100 | } | 
|  | 101 |  | 
|  | 102 | #define variadic_pasting_args1(x, y, z) y | 
|  | 103 | #define variadic_pasting_args2(x, ...) variadic_pasting_args1(x ## __VA_ARGS__) | 
|  | 104 | #define variadic_pasting_args2a(x, y, ...) variadic_pasting_args1(x, y ## __VA_ARGS__) | 
|  | 105 | #define variadic_pasting_args3(x, y, ...) variadic_pasting_args2(x, y, __VA_ARGS__) | 
|  | 106 | #define variadic_pasting_args3a(x, y, ...) variadic_pasting_args2a(x, y, __VA_ARGS__) | 
|  | 107 |  | 
|  | 108 | void test3() { | 
|  | 109 | variadic_pasting_args3(1, 2, 3, 4); | 
|  | 110 | // CHECK: {{.*}}:109:32: warning: expression result unused | 
| Chandler Carruth | 8c43e66 | 2011-10-24 18:51:08 +0000 | [diff] [blame] | 111 | // CHECK: {{.*}}:105:72: note: expanded from macro 'variadic_pasting_args3' | 
|  | 112 | // CHECK: {{.*}}:103:68: note: expanded from macro 'variadic_pasting_args2' | 
|  | 113 | // CHECK: {{.*}}:102:41: note: expanded from macro 'variadic_pasting_args1' | 
| Chandler Carruth | 2536c07 | 2011-07-08 01:04:21 +0000 | [diff] [blame] | 114 |  | 
|  | 115 | variadic_pasting_args3a(1, 2, 3, 4); | 
| Abramo Bagnara | e398e60 | 2011-10-03 18:39:03 +0000 | [diff] [blame] | 116 | // CHECK: {{.*}}:115:30: warning: expression result unused | 
| Chandler Carruth | 8c43e66 | 2011-10-24 18:51:08 +0000 | [diff] [blame] | 117 | // CHECK: {{.*}}:106:71: note: expanded from macro 'variadic_pasting_args3a' | 
|  | 118 | // CHECK: {{.*}}:104:70: note: expanded from macro 'variadic_pasting_args2a' | 
|  | 119 | // CHECK: {{.*}}:102:41: note: expanded from macro 'variadic_pasting_args1' | 
| Chandler Carruth | 2536c07 | 2011-07-08 01:04:21 +0000 | [diff] [blame] | 120 | } | 
| Eli Friedman | 34ff0ea | 2012-11-03 03:36:51 +0000 | [diff] [blame] | 121 |  | 
|  | 122 | #define BAD_CONDITIONAL_OPERATOR (2<3)?2:3 | 
|  | 123 | int test4 = BAD_CONDITIONAL_OPERATOR+BAD_CONDITIONAL_OPERATOR; | 
|  | 124 | // CHECK:         {{.*}}:122:39: note: expanded from macro 'BAD_CONDITIONAL_OPERATOR' | 
|  | 125 | // CHECK-NEXT:    #define BAD_CONDITIONAL_OPERATOR (2<3)?2:3 | 
|  | 126 | // CHECK-NEXT: {{^                                      \^}} | 
|  | 127 | // CHECK:         {{.*}}:122:39: note: expanded from macro 'BAD_CONDITIONAL_OPERATOR' | 
|  | 128 | // CHECK-NEXT:    #define BAD_CONDITIONAL_OPERATOR (2<3)?2:3 | 
|  | 129 | // CHECK-NEXT: {{^                                      \^}} | 
|  | 130 | // CHECK:         {{.*}}:122:39: note: expanded from macro 'BAD_CONDITIONAL_OPERATOR' | 
|  | 131 | // CHECK-NEXT:    #define BAD_CONDITIONAL_OPERATOR (2<3)?2:3 | 
|  | 132 | // CHECK-NEXT: {{^                                 ~~~~~\^~~~}} | 
|  | 133 |  | 
|  | 134 | #define QMARK ? | 
|  | 135 | #define TWOL (2< | 
|  | 136 | #define X 1+TWOL 3) QMARK 4:5 | 
|  | 137 | int x = X; | 
|  | 138 | // CHECK:         {{.*}}:137:9: note: place parentheses around the '+' expression to silence this warning | 
|  | 139 | // CHECK-NEXT:    int x = X; | 
|  | 140 | // CHECK-NEXT: {{^        \^}} | 
|  | 141 | // CHECK-NEXT:    {{.*}}:136:21: note: expanded from macro 'X' | 
|  | 142 | // CHECK-NEXT:    #define X 1+TWOL 3) QMARK 4:5 | 
|  | 143 | // CHECK-NEXT: {{^          ~~~~~~~~~ \^}} | 
|  | 144 | // CHECK-NEXT:    {{.*}}:134:15: note: expanded from macro 'QMARK' | 
|  | 145 | // CHECK-NEXT:    #define QMARK ? | 
|  | 146 | // CHECK-NEXT: {{^              \^}} | 
|  | 147 | // CHECK-NEXT:    {{.*}}:137:9: note: place parentheses around the '?:' expression to evaluate it first | 
|  | 148 | // CHECK-NEXT:    int x = X; | 
|  | 149 | // CHECK-NEXT: {{^        \^}} | 
|  | 150 | // CHECK-NEXT:    {{.*}}:136:21: note: expanded from macro 'X' | 
|  | 151 | // CHECK-NEXT:    #define X 1+TWOL 3) QMARK 4:5 | 
|  | 152 | // CHECK-NEXT: {{^            ~~~~~~~~\^~~~~~~~~}} | 
|  | 153 |  | 
|  | 154 | #define ONEPLUS 1+ | 
|  | 155 | #define Y ONEPLUS (2<3) QMARK 4:5 | 
|  | 156 | int y = Y; | 
|  | 157 | // CHECK:         {{.*}}:156:9: warning: operator '?:' has lower precedence than '+'; '+' will be evaluated first | 
|  | 158 | // CHECK-NEXT:    int y = Y; | 
|  | 159 | // CHECK-NEXT: {{^        \^}} | 
|  | 160 | // CHECK-NEXT:    {{.*}}:155:25: note: expanded from macro 'Y' | 
|  | 161 | // CHECK-NEXT:    #define Y ONEPLUS (2<3) QMARK 4:5 | 
|  | 162 | // CHECK-NEXT: {{^          ~~~~~~~~~~~~~ \^}} | 
|  | 163 | // CHECK-NEXT:    {{.*}}:134:15: note: expanded from macro 'QMARK' | 
|  | 164 | // CHECK-NEXT:    #define QMARK ? | 
|  | 165 | // CHECK-NEXT: {{^              \^}} | 
| Eli Friedman | dea98de | 2012-11-30 06:19:40 +0000 | [diff] [blame] | 166 |  | 
|  | 167 | // PR14399 | 
|  | 168 | void iequals(int,int,int); | 
|  | 169 | void foo_aa() | 
|  | 170 | { | 
|  | 171 | #define /* */ BARC(c, /* */b, a, ...) (a+b+/* */c + __VA_ARGS__ +0) | 
|  | 172 | iequals(__LINE__, BARC(4,3,2,6,8), 8); | 
|  | 173 | } | 
|  | 174 | // CHECK:         {{.*}}:172:21: warning: expression result unused | 
|  | 175 | // CHECK-NEXT:      iequals(__LINE__, BARC(4,3,2,6,8), 8); | 
|  | 176 | // CHECK-NEXT: {{^                    \^~~~~~~~~~~~~~~}} | 
|  | 177 | // CHECK-NEXT:    {{.*}}:171:51: note: expanded from macro 'BARC' | 
|  | 178 | // CHECK-NEXT:    #define /* */ BARC(c, /* */b, a, ...) (a+b+/* */c + __VA_ARGS__ +0) | 
|  | 179 | // CHECK-NEXT: {{^                                       ~~~~~~~~~~ \^}} |