diff options
-rw-r--r-- | include/clang/Basic/DiagnosticKinds.def | 2 | ||||
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 6 | ||||
-rw-r--r-- | test/Parser/declarators.c | 4 | ||||
-rw-r--r-- | test/Sema/arg-duplicate.c | 1 |
4 files changed, 11 insertions, 2 deletions
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index 243d56108b..1de1b6b80f 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/include/clang/Basic/DiagnosticKinds.def @@ -631,6 +631,8 @@ DIAG(err_first_label, ERROR, DIAG(err_unexpected_typedef, ERROR, "unexpected type name '%0': expected expression") +DIAG(err_unexpected_typedef_ident, ERROR, + "unexpected type name '%0': expected identifier") DIAG(err_undeclared_var_use, ERROR, "use of undeclared identifier '%0'") DIAG(warn_deprecated, WARNING, diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 9445a4862c..cae0cbb8ec 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -1415,8 +1415,12 @@ void Parser::ParseFunctionDeclaratorIdentifierList(SourceLocation LParenLoc, SkipUntil(tok::r_paren); return; } - + IdentifierInfo *ParmII = Tok.getIdentifierInfo(); + + // Reject 'typedef int y; int test(x, y)', but continue parsing. + if (Actions.isTypeName(*ParmII, CurScope)) + Diag(Tok, diag::err_unexpected_typedef_ident, ParmII->getName()); // Verify that the argument identifier has not already been mentioned. if (!ParamsSoFar.insert(ParmII)) { diff --git a/test/Parser/declarators.c b/test/Parser/declarators.c index 15ae7c6b57..410ac3686f 100644 --- a/test/Parser/declarators.c +++ b/test/Parser/declarators.c @@ -25,4 +25,8 @@ int test2(int *P, int A) { int Array[*(int*)P+A]; } +typedef int atype; +int test3(x, + atype /* expected-error {{unexpected type name 'atype': expected identifier}} */ + ) int x, atype; {} diff --git a/test/Sema/arg-duplicate.c b/test/Sema/arg-duplicate.c index b57fd950bf..81cb8fd9c2 100644 --- a/test/Sema/arg-duplicate.c +++ b/test/Sema/arg-duplicate.c @@ -1,6 +1,5 @@ // RUN: clang -fsyntax-only -verify %s -typedef int x; int f3(y, x, x) // expected-error {{redefinition of parameter}} int y, x, |