brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.0 KiB · 40f5316 Raw
183 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s2// RUN: not %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s3namespace std {4  template <class X>5  class initializer_list {6    public: const X *a, *b;7    initializer_list();8  };9}10 11class Foo {12public: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}}20void 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 arguments76// are used in the macro expansion.77void 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 list138// will be interpretted as argument separaters and adding parenthesis will139// make it no longer an initializer list.140void 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}}168void 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