Fix some C++ error recovery problems in init declarator parsing

that I noticed working on other things.

Instead of emitting:

t2.cc:1:8: error: use of undeclared identifier 'g'
int x(*g);
       ^
t2.cc:1:10: error: expected ')'
int x(*g);
         ^
t2.cc:1:6: note: to match this '('
int x(*g);
     ^

We now only emit:

t2.cc:1:7: warning: type specifier missing, defaults to 'int'
int x(*g);
      ^


Note that the example in SemaCXX/nested-name-spec.cpp:f4 is still
not great, we now produce both of:

void f4(undef::C); // expected-error {{use of undeclared identifier 'undef'}} \
                      expected-error {{variable has incomplete type 'void'}}

The second diagnostic should be silenced by something getting marked invalid.
I don't plan to fix this though.

llvm-svn: 68919
This commit is contained in:
Chris Lattner 2009-04-12 22:23:27 +00:00
parent 090d34c692
commit 869c6610c7
3 changed files with 8 additions and 7 deletions

View File

@ -380,15 +380,12 @@ ParseInitDeclaratorListAfterFirstDeclarator(Declarator &D) {
ExprVector Exprs(Actions);
CommaLocsTy CommaLocs;
bool InvalidExpr = false;
if (ParseExpressionList(Exprs, CommaLocs)) {
SkipUntil(tok::r_paren);
InvalidExpr = true;
}
} else {
// Match the ')'.
SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
if (!InvalidExpr) {
assert(!Exprs.empty() && Exprs.size()-1 == CommaLocs.size() &&
"Unexpected number of commas!");
Actions.AddCXXDirectInitializerToDecl(ThisDecl, LParenLoc,

View File

@ -0,0 +1,3 @@
// RUN: clang-cc -verify -fsyntax-only %s
int x(*g); // expected-error {{use of undeclared identifier 'g'}}

View File

@ -93,7 +93,8 @@ void f3() {
}
// make sure the following doesn't hit any asserts
void f4(undef::C); // expected-error {{use of undeclared identifier 'undef'}} // expected-error {{expected ')'}} expected-note {{to match this '('}} // expected-error {{variable has incomplete type 'void'}}
void f4(undef::C); // expected-error {{use of undeclared identifier 'undef'}} \
expected-error {{variable has incomplete type 'void'}}
typedef void C2::f5(int); // expected-error{{typedef declarator cannot be qualified}}