| // RUN: %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck %s |
| |
| #define M1(x) x |
| #define M2 1; |
| void foo() { |
| M1( |
| M2); |
| // CHECK: :7:{{[0-9]+}}: warning: expression result unused |
| // CHECK: :4:{{[0-9]+}}: note: expanded from: |
| // CHECK: :3:{{[0-9]+}}: note: expanded from: |
| } |
| |
| #define A 1 |
| #define B A |
| #define C B |
| void bar() { |
| C; |
| // CHECK: :17:3: warning: expression result unused |
| // CHECK: :15:11: note: expanded from: |
| // CHECK: :14:11: note: expanded from: |
| // CHECK: :13:11: note: expanded from: |
| } |
| |
| // rdar://7597492 |
| #define sprintf(str, A, B) \ |
| __builtin___sprintf_chk (str, 0, 42, A, B) |
| |
| void baz(char *Msg) { |
| sprintf(Msg, " sizeof FoooLib : =%3u\n", 12LL); |
| } |
| |
| |
| // PR9279: comprehensive tests for multi-level macro back traces |
| #define macro_args1(x) x |
| #define macro_args2(x) macro_args1(x) |
| #define macro_args3(x) macro_args2(x) |
| |
| #define macro_many_args1(x, y, z) y |
| #define macro_many_args2(x, y, z) macro_many_args1(x, y, z) |
| #define macro_many_args3(x, y, z) macro_many_args2(x, y, z) |
| |
| void test() { |
| macro_args3(1); |
| // CHECK: {{.*}}:43:15: warning: expression result unused |
| // Also check that the 'caret' printing agrees with the location here where |
| // its easy to FileCheck. |
| // CHECK-NEXT: macro_args3(1); |
| // CHECK-NEXT: ~~~~~~~~~~~~^~ |
| // CHECK: {{.*}}:36:36: note: expanded from: |
| // CHECK: {{.*}}:35:36: note: expanded from: |
| // CHECK: {{.*}}:34:24: note: expanded from: |
| |
| macro_many_args3( |
| 1, |
| 2, |
| 3); |
| // CHECK: {{.*}}:55:5: warning: expression result unused |
| // CHECK: {{.*}}:40:55: note: expanded from: |
| // CHECK: {{.*}}:39:55: note: expanded from: |
| // CHECK: {{.*}}:38:35: note: expanded from: |
| |
| macro_many_args3( |
| 1, |
| M2, |
| 3); |
| // CHECK: {{.*}}:64:5: warning: expression result unused |
| // CHECK: {{.*}}:4:12: note: expanded from: |
| // CHECK: {{.*}}:40:55: note: expanded from: |
| // CHECK: {{.*}}:39:55: note: expanded from: |
| // CHECK: {{.*}}:38:35: note: expanded from: |
| |
| macro_many_args3( |
| 1, |
| macro_args2(2), |
| 3); |
| // CHECK: {{.*}}:74:17: warning: expression result unused |
| // This caret location needs to be printed *inside* a different macro's |
| // arguments. |
| // CHECK-NEXT: macro_args2(2), |
| // CHECK-NEXT: ~~~~~~~~~~~~^~~ |
| // CHECK: {{.*}}:35:36: note: expanded from: |
| // CHECK: {{.*}}:34:24: note: expanded from: |
| // CHECK: {{.*}}:40:55: note: expanded from: |
| // CHECK: {{.*}}:39:55: note: expanded from: |
| // CHECK: {{.*}}:38:35: note: expanded from: |
| } |
| |
| #define variadic_args1(x, y, ...) y |
| #define variadic_args2(x, ...) variadic_args1(x, __VA_ARGS__) |
| #define variadic_args3(x, y, ...) variadic_args2(x, y, __VA_ARGS__) |
| |
| void test2() { |
| variadic_args3(1, 2, 3, 4); |
| // CHECK: {{.*}}:93:21: warning: expression result unused |
| // CHECK-NEXT: variadic_args3(1, 2, 3, 4); |
| // CHECK-NEXT: ~~~~~~~~~~~~~~~~~~^~~~~~~~ |
| // CHECK: {{.*}}:90:53: note: expanded from: |
| // CHECK: {{.*}}:89:50: note: expanded from: |
| // CHECK: {{.*}}:88:35: note: expanded from: |
| } |
| |
| #define variadic_pasting_args1(x, y, z) y |
| #define variadic_pasting_args2(x, ...) variadic_pasting_args1(x ## __VA_ARGS__) |
| #define variadic_pasting_args2a(x, y, ...) variadic_pasting_args1(x, y ## __VA_ARGS__) |
| #define variadic_pasting_args3(x, y, ...) variadic_pasting_args2(x, y, __VA_ARGS__) |
| #define variadic_pasting_args3a(x, y, ...) variadic_pasting_args2a(x, y, __VA_ARGS__) |
| |
| void test3() { |
| variadic_pasting_args3(1, 2, 3, 4); |
| // CHECK: {{.*}}:109:32: warning: expression result unused |
| // CHECK: {{.*}}:105:72: note: expanded from: |
| // CHECK: {{.*}}:103:68: note: expanded from: |
| // CHECK: {{.*}}:102:41: note: expanded from: |
| |
| variadic_pasting_args3a(1, 2, 3, 4); |
| // FIXME: It'd be really nice to retain the start location of the first token |
| // involved in the token paste instead of falling back on the full macro |
| // location in the first two locations here. |
| // CHECK: {{.*}}:115:3: warning: expression result unused |
| // CHECK: {{.*}}:106:44: note: expanded from: |
| // CHECK: {{.*}}:104:72: note: expanded from: |
| // CHECK: {{.*}}:102:41: note: expanded from: |
| } |