Home | History | Annotate | Download | only in Preprocessor
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
      2 // RUN: not %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
      3 namespace std {
      4   template <class X>
      5   class initializer_list {
      6     public:
      7     initializer_list();
      8   };
      9 }
     10 
     11 class Foo {
     12 public:
     13   Foo();
     14   Foo(std::initializer_list<int>);
     15   bool operator==(const Foo);
     16   Foo operator+(const Foo);
     17 };
     18 
     19 #define EQ(x,y) (void)(x == y)  // expected-note 6{{defined here}}
     20 void test_EQ() {
     21   Foo F;
     22   F = Foo{1,2};
     23 
     24   EQ(F,F);
     25   EQ(F,Foo());
     26   EQ(F,Foo({1,2,3}));
     27   EQ(Foo({1,2,3}),F);
     28   EQ((Foo{1,2,3}),(Foo{1,2,3}));
     29   EQ(F, F + F);
     30   EQ(F, Foo({1,2,3}) + Foo({1,2,3}));
     31   EQ(F, (Foo{1,2,3} + Foo{1,2,3}));
     32 
     33   EQ(F,Foo{1,2,3});
     34   // expected-error@-1 {{too many arguments provided}}
     35   // expected-note@-2 {{parentheses are required}}
     36   EQ(Foo{1,2,3},F);
     37   // expected-error@-1 {{too many arguments provided}}
     38   // expected-note@-2 {{parentheses are required}}
     39   EQ(Foo{1,2,3},Foo{1,2,3});
     40   // expected-error@-1 {{too many arguments provided}}
     41   // expected-note@-2 {{parentheses are required}}
     42 
     43   EQ(Foo{1,2,3} + Foo{1,2,3}, F);
     44   // expected-error@-1 {{too many arguments provided}}
     45   // expected-note@-2 {{parentheses are required}}
     46   EQ(F, Foo({1,2,3}) + Foo{1,2,3});
     47   // expected-error@-1 {{too many arguments provided}}
     48   // expected-note@-2 {{parentheses are required}}
     49   EQ(F, Foo{1,2,3} + Foo{1,2,3});
     50   // expected-error@-1 {{too many arguments provided}}
     51   // expected-note@-2 {{parentheses are required}}
     52 }
     53 
     54 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{33:8-33:8}:"("
     55 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{33:18-33:18}:")"
     56 
     57 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{36:6-36:6}:"("
     58 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{36:16-36:16}:")"
     59 
     60 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:6-39:6}:"("
     61 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:16-39:16}:")"
     62 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:17-39:17}:"("
     63 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:27-39:27}:")"
     64 
     65 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{43:6-43:6}:"("
     66 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{43:29-43:29}:")"
     67 
     68 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{46:9-46:9}:"("
     69 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{46:34-46:34}:")"
     70 
     71 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{49:9-49:9}:"("
     72 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{49:32-49:32}:")"
     73 
     74 #define NE(x,y) (void)(x != y)  // expected-note 6{{defined here}}
     75 // Operator != isn't defined.  This tests that the corrected macro arguments
     76 // are used in the macro expansion.
     77 void test_NE() {
     78   Foo F;
     79 
     80   NE(F,F);
     81   // expected-error@-1 {{invalid operands}}
     82   NE(F,Foo());
     83   // expected-error@-1 {{invalid operands}}
     84   NE(F,Foo({1,2,3}));
     85   // expected-error@-1 {{invalid operands}}
     86   NE((Foo{1,2,3}),(Foo{1,2,3}));
     87   // expected-error@-1 {{invalid operands}}
     88 
     89   NE(F,Foo{1,2,3});
     90   // expected-error@-1 {{too many arguments provided}}
     91   // expected-note@-2 {{parentheses are required}}
     92   // expected-error@-3 {{invalid operands}}
     93   NE(Foo{1,2,3},F);
     94   // expected-error@-1 {{too many arguments provided}}
     95   // expected-note@-2 {{parentheses are required}}
     96   // expected-error@-3 {{invalid operands}}
     97   NE(Foo{1,2,3},Foo{1,2,3});
     98   // expected-error@-1 {{too many arguments provided}}
     99   // expected-note@-2 {{parentheses are required}}
    100   // expected-error@-3 {{invalid operands}}
    101 
    102   NE(Foo{1,2,3} + Foo{1,2,3}, F);
    103   // expected-error@-1 {{too many arguments provided}}
    104   // expected-note@-2 {{parentheses are required}}
    105   // expected-error@-3 {{invalid operands}}
    106   NE(F, Foo({1,2,3}) + Foo{1,2,3});
    107   // expected-error@-1 {{too many arguments provided}}
    108   // expected-note@-2 {{parentheses are required}}
    109   // expected-error@-3 {{invalid operands}}
    110   NE(F, Foo{1,2,3} + Foo{1,2,3});
    111   // expected-error@-1 {{too many arguments provided}}
    112   // expected-note@-2 {{parentheses are required}}
    113   // expected-error@-3 {{invalid operands}}
    114 }
    115 
    116 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{89:8-89:8}:"("
    117 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{89:18-89:18}:")"
    118 
    119 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{93:6-93:6}:"("
    120 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{93:16-93:16}:")"
    121 
    122 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:6-97:6}:"("
    123 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:16-97:16}:")"
    124 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:17-97:17}:"("
    125 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:27-97:27}:")"
    126 
    127 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{102:6-102:6}:"("
    128 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{102:29-102:29}:")"
    129 
    130 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{106:9-106:9}:"("
    131 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{106:34-106:34}:")"
    132 
    133 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:9-110:9}:"("
    134 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:32-110:32}:")"
    135 
    136 #define INIT(var, init) Foo var = init; // expected-note 3{{defined here}}
    137 // Can't use an initializer list as a macro argument.  The commas in the list
    138 // will be interpretted as argument separaters and adding parenthesis will
    139 // make it no longer an initializer list.
    140 void test() {
    141   INIT(a, Foo());
    142   INIT(b, Foo({1, 2, 3}));
    143   INIT(c, Foo());
    144 
    145   INIT(d, Foo{1, 2, 3});
    146   // expected-error@-1 {{too many arguments provided}}
    147   // expected-note@-2 {{parentheses are required}}
    148 
    149   // Can't be fixed by parentheses.
    150   INIT(e, {1, 2, 3});
    151   // expected-error@-1 {{too many arguments provided}}
    152   // expected-error@-2 {{use of undeclared identifier}}
    153   // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}}
    154 
    155   // Can't be fixed by parentheses.
    156   INIT(e, {1, 2, 3} + {1, 2, 3});
    157   // expected-error@-1 {{too many arguments provided}}
    158   // expected-error@-2 {{use of undeclared identifier}}
    159   // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}}
    160 }
    161 
    162 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:11-145:11}:"("
    163 // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:23-145:23}:")"
    164 
    165 #define M(name,a,b,c,d,e,f,g,h,i,j,k,l) \
    166   Foo name = a + b + c + d + e + f + g + h + i + j + k + l;
    167 // expected-note@-2 2{{defined here}}
    168 void test2() {
    169   M(F1, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(),
    170         Foo(), Foo(), Foo(), Foo(), Foo(), Foo());
    171 
    172   M(F2, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3},
    173         Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3});
    174   // expected-error@-2 {{too many arguments provided}}
    175   // expected-note@-3 {{parentheses are required}}
    176 
    177   M(F3, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3},
    178         {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3});
    179   // expected-error@-2 {{too many arguments provided}}
    180   // expected-error@-3 {{use of undeclared identifier}}
    181   // expected-note@-4 {{cannot use initializer list at the beginning of a macro argument}}
    182 }
    183