1 // RUN: %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck %s 2 3 #define M1(x) x 4 #define M2 1; 5 void foo() { 6 M1( 7 M2); 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' 11 } 12 13 #define A 1 14 #define B A 15 #define C B 16 void bar() { 17 C; 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' 22 } 23 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 32 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) 37 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) 41 42 void test() { 43 macro_args3(1); 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. 47 // CHECK-NEXT: macro_args3(1); 48 // CHECK-NEXT: ~~~~~~~~~~~~^~ 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' 52 53 macro_many_args3( 54 1, 55 2, 56 3); 57 // CHECK: {{.*}}:55:5: warning: expression result unused 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' 61 62 macro_many_args3( 63 1, 64 M2, 65 3); 66 // CHECK: {{.*}}:64:5: warning: expression result unused 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' 71 72 macro_many_args3( 73 1, 74 macro_args2(2), 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. 79 // CHECK-NEXT: macro_args2(2), 80 // CHECK-NEXT: ~~~~~~~~~~~~^~~ 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' 86 } 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() { 93 variadic_args3(1, 2, 3, 4); 94 // CHECK: {{.*}}:93:21: warning: expression result unused 95 // CHECK-NEXT: variadic_args3(1, 2, 3, 4); 96 // CHECK-NEXT: ~~~~~~~~~~~~~~~~~~^~~~~~~~ 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' 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 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' 114 115 variadic_pasting_args3a(1, 2, 3, 4); 116 // CHECK: {{.*}}:115:30: warning: expression result unused 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' 120 } 121