Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-c++11-extensions %s
      2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 -Wno-c++11-extensions %s
      3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
      4 
      5 struct A {};
      6 struct B {};
      7 struct D {
      8   A fizbin;  // expected-note 2 {{declared here}}
      9   A foobar;  // expected-note 2 {{declared here}}
     10   B roxbin;  // expected-note 2 {{declared here}}
     11   B toobad;  // expected-note 2 {{declared here}}
     12   void BooHoo();
     13   void FoxBox();
     14 };
     15 
     16 void something(A, B);
     17 void test() {
     18   D obj;
     19   something(obj.fixbin,   // expected-error {{did you mean 'fizbin'?}}
     20             obj.toobat);  // expected-error {{did you mean 'toobad'?}}
     21   something(obj.toobat,   // expected-error {{did you mean 'foobar'?}}
     22             obj.fixbin);  // expected-error {{did you mean 'roxbin'?}}
     23   something(obj.fixbin,   // expected-error {{did you mean 'fizbin'?}}
     24             obj.fixbin);  // expected-error {{did you mean 'roxbin'?}}
     25   something(obj.toobat,   // expected-error {{did you mean 'foobar'?}}
     26             obj.toobat);  // expected-error {{did you mean 'toobad'?}}
     27   // Both members could be corrected to methods, but that isn't valid.
     28   something(obj.boohoo,   // expected-error-re {{no member named 'boohoo' in 'D'{{$}}}}
     29             obj.foxbox);  // expected-error-re {{no member named 'foxbox' in 'D'{{$}}}}
     30   // The first argument has a usable correction but the second doesn't.
     31   something(obj.boobar,   // expected-error-re {{no member named 'boobar' in 'D'{{$}}}}
     32             obj.foxbox);  // expected-error-re {{no member named 'foxbox' in 'D'{{$}}}}
     33 }
     34 
     35 // Ensure the delayed typo correction does the right thing when trying to
     36 // recover using a seemingly-valid correction for which a valid expression to
     37 // replace the TypoExpr cannot be created (but which does have a second
     38 // correction candidate that would be a valid and usable correction).
     39 class Foo {
     40 public:
     41   template <> void testIt();  // expected-error {{no function template matches}}
     42   void textIt();  // expected-note {{'textIt' declared here}}
     43 };
     44 void testMemberExpr(Foo *f) {
     45   f->TestIt();  // expected-error {{no member named 'TestIt' in 'Foo'; did you mean 'textIt'?}}
     46 }
     47 
     48 void callee(double, double);
     49 void testNoCandidates() {
     50   callee(xxxxxx,   // expected-error-re {{use of undeclared identifier 'xxxxxx'{{$}}}}
     51          zzzzzz);  // expected-error-re {{use of undeclared identifier 'zzzzzz'{{$}}}}
     52 }
     53 
     54 class string {};
     55 struct Item {
     56   void Nest();
     57   string text();
     58   Item* next();  // expected-note {{'next' declared here}}
     59 };
     60 void testExprFilter(Item *i) {
     61   Item *j;
     62   j = i->Next();  // expected-error {{no member named 'Next' in 'Item'; did you mean 'next'?}}
     63 }
     64 
     65 // Test that initializer expressions are handled correctly and that the type
     66 // being initialized is taken into account when choosing a correction.
     67 namespace initializerCorrections {
     68 struct Node {
     69   string text() const;
     70   // Node* Next() is not implemented yet
     71 };
     72 void f(Node *node) {
     73   // text is only an edit distance of 1 from Next, but would trigger type
     74   // conversion errors if used in this initialization expression.
     75   Node *next = node->Next();  // expected-error-re {{no member named 'Next' in 'initializerCorrections::Node'{{$}}}}
     76 }
     77 
     78 struct LinkedNode {
     79   LinkedNode* next();  // expected-note {{'next' declared here}}
     80   string text() const;
     81 };
     82 void f(LinkedNode *node) {
     83   // text and next are equidistant from Next, but only one results in a valid
     84   // initialization expression.
     85   LinkedNode *next = node->Next();  // expected-error {{no member named 'Next' in 'initializerCorrections::LinkedNode'; did you mean 'next'?}}
     86 }
     87 
     88 struct NestedNode {
     89   NestedNode* Nest();
     90   NestedNode* next();
     91   string text() const;
     92 };
     93 void f(NestedNode *node) {
     94   // There are two equidistant, usable corrections for Next: next and Nest
     95   NestedNode *next = node->Next();  // expected-error-re {{no member named 'Next' in 'initializerCorrections::NestedNode'{{$}}}}
     96 }
     97 }
     98 
     99 namespace PR21669 {
    100 void f(int *i) {
    101   // Check that arguments to a builtin with custom type checking are corrected
    102   // properly, since calls to such builtins bypass much of the normal code path
    103   // for building and checking the call.
    104   __atomic_load(i, i, something_something);  // expected-error-re {{use of undeclared identifier 'something_something'{{$}}}}
    105 }
    106 }
    107 
    108 const int DefaultArg = 9;  // expected-note {{'DefaultArg' declared here}}
    109 template <int I = defaultArg> struct S {};  // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}}
    110 S<1> s;
    111 
    112 namespace foo {}
    113 void test_paren_suffix() {
    114   foo::bar({5, 6});  // expected-error-re {{no member named 'bar' in namespace 'foo'{{$}}}}
    115 #if __cplusplus <= 199711L
    116   // expected-error@-2 {{expected expression}}
    117 #endif
    118 }
    119 
    120 const int kNum = 10;  // expected-note {{'kNum' declared here}}
    121 class SomeClass {
    122   int Kind;
    123 public:
    124   explicit SomeClass() : Kind(kSum) {}  // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}}
    125 };
    126 
    127 // There used to be an issue with typo resolution inside overloads.
    128 struct AssertionResult { ~AssertionResult(); };
    129 AssertionResult Overload(const char *a);
    130 AssertionResult Overload(int a);
    131 void UseOverload() {
    132   // expected-note@+1 {{'result' declared here}}
    133   const char *result;
    134   // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}}
    135   Overload(resulta);
    136 }
    137 
    138 namespace PR21925 {
    139 struct X {
    140   int get() { return 7; }  // expected-note {{'get' declared here}}
    141 };
    142 void test() {
    143   X variable;  // expected-note {{'variable' declared here}}
    144 
    145   // expected-error@+2 {{use of undeclared identifier 'variableX'; did you mean 'variable'?}}
    146   // expected-error@+1 {{no member named 'getX' in 'PR21925::X'; did you mean 'get'?}}
    147   int x = variableX.getX();
    148 }
    149 }
    150 
    151 namespace PR21905 {
    152 int (*a) () = (void)Z;  // expected-error-re {{use of undeclared identifier 'Z'{{$}}}}
    153 }
    154 
    155 namespace PR21947 {
    156 int blue;  // expected-note {{'blue' declared here}}
    157 __typeof blur y;  // expected-error {{use of undeclared identifier 'blur'; did you mean 'blue'?}}
    158 }
    159 
    160 namespace PR22092 {
    161 a = b ? : 0;  // expected-error {{C++ requires a type specifier for all declarations}} \
    162               // expected-error-re {{use of undeclared identifier 'b'{{$}}}}
    163 }
    164 
    165 extern long clock (void);
    166 struct Pointer {
    167   void set_xpos(int);
    168   void set_ypos(int);
    169 };
    170 void MovePointer(Pointer &Click, int x, int y) {  // expected-note 2 {{'Click' declared here}}
    171   click.set_xpos(x);  // expected-error {{use of undeclared identifier 'click'; did you mean 'Click'?}}
    172   click.set_ypos(x);  // expected-error {{use of undeclared identifier 'click'; did you mean 'Click'?}}
    173 }
    174 
    175 namespace PR22250 {
    176 // expected-error@+4 {{use of undeclared identifier 'size_t'; did you mean 'sizeof'?}}
    177 // expected-error-re@+3 {{use of undeclared identifier 'y'{{$}}}}
    178 // expected-error-re@+2 {{use of undeclared identifier 'z'{{$}}}}
    179 // expected-error@+1 {{expected ';' after top level declarator}}
    180 int getenv_s(size_t *y, char(&z)) {}
    181 }
    182 
    183 namespace PR22291 {
    184 template <unsigned I> void f() {
    185   unsigned *prio_bits_array;  // expected-note {{'prio_bits_array' declared here}}
    186   // expected-error@+1 {{use of undeclared identifier 'prio_op_array'; did you mean 'prio_bits_array'?}}
    187   __atomic_store_n(prio_op_array + I, false, __ATOMIC_RELAXED);
    188 }
    189 }
    190 
    191 namespace PR22297 {
    192 double pow(double x, double y);
    193 struct TimeTicks {
    194   static void Now();  // expected-note {{'Now' declared here}}
    195 };
    196 void f() {
    197   TimeTicks::now();  // expected-error {{no member named 'now' in 'PR22297::TimeTicks'; did you mean 'Now'?}}
    198 }
    199 }
    200 
    201 namespace PR23005 {
    202 void f() { int a = Unknown::b(c); }  // expected-error {{use of undeclared identifier 'Unknown'}}
    203 // expected-error@-1 {{use of undeclared identifier 'c'}}
    204 }
    205 
    206 namespace PR23350 {
    207 int z = 1 ? N : ;  // expected-error {{expected expression}}
    208 // expected-error-re@-1 {{use of undeclared identifier 'N'{{$}}}}
    209 }
    210 
    211 // PR 23285. This test must be at the end of the file to avoid additional,
    212 // unwanted diagnostics.
    213 // expected-error-re@+2 {{use of undeclared identifier 'uintmax_t'{{$}}}}
    214 // expected-error@+1 {{expected ';' after top level declarator}}
    215 unsigned int a = 0(uintmax_t
    216