]> granicus.if.org Git - clang/commitdiff
[C++] Interpret unknown identifier in parameter clause as unknown type
authorNicolas Lesser <blitzrakete@gmail.com>
Sun, 5 May 2019 12:15:17 +0000 (12:15 +0000)
committerNicolas Lesser <blitzrakete@gmail.com>
Sun, 5 May 2019 12:15:17 +0000 (12:15 +0000)
instead of as parameter name without a type.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@359979 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseDecl.cpp
test/Parser/editor-placeholder-recovery.cpp
test/SemaCXX/unknown-type-name.cpp

index f63fd56a898d6586fdca43ca69dfac19b901aa8c..f883ecc45f1854792af33d6239e1e098e4e24b64 100644 (file)
@@ -2649,6 +2649,9 @@ bool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS,
     case tok::semi:
       // This looks like a variable or function declaration. The type is
       // probably missing. We're done parsing decl-specifiers.
+      // But only if we are not in a function prototype scope.
+      if (getCurScope()->isFunctionPrototypeScope())
+        break;
       if (SS)
         AnnotateScopeToken(*SS, /*IsNewAnnotation*/false);
       return false;
index d68e087d6fbace5f0c648e6499ad5759946ee7e0..62f5529906f9316649cb17cecb2f1bf4095805b1 100644 (file)
@@ -64,7 +64,7 @@ void avoidPlaceholderErrors(Struct &obj) {
     }
 }
 
-void Struct::method(<#Struct &x#>, noSupressionHere) { // expected-error {{unknown type name 'noSupressionHere'}} expected-error {{C++ requires a type specifier for all declarations}}
+void Struct::method(<#Struct &x#>, noSupressionHere) { // expected-error {{unknown type name 'noSupressionHere'}}
 #ifndef SUPPRESS
   // expected-error@-2 {{editor placeholder in source file}}
 #endif
index 9086c9acc4385141c5cde01eab2f7c5bdd82aedf..bacdee4b3703f127a37d9bcdd04153019b0ce61e 100644 (file)
@@ -72,9 +72,7 @@ void f(int, T::type x, char) { } // expected-error{{missing 'typename'}}
 
 int *p;
 
-// FIXME: We should assume that 'undeclared' is a type, not a parameter name
-//        here, and produce an 'unknown type name' diagnostic instead.
-int f1(undeclared, int); // expected-error{{requires a type specifier}}
+int f1(undeclared, int); // expected-error{{unknown type name 'undeclared'}}
 
 int f2(undeclared, 0); // expected-error{{undeclared identifier}}