]> granicus.if.org Git - clang/commitdiff
If we see a declaration which is either missing a type or has a malformed type,
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 15 May 2012 21:29:55 +0000 (21:29 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 15 May 2012 21:29:55 +0000 (21:29 +0000)
and the thing we have has a scope specifier, and we're in a context that doesn't
allow declaring a qualified name, then the error is a malformed type, not a
missing type.

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

lib/Parse/ParseDecl.cpp
test/SemaCXX/unknown-type-name.cpp

index dcc96cb8614b3eabb18542cdf831a24402b28d4c..36e30137019c4adac836df666302694eeb8520a5 100644 (file)
@@ -1707,7 +1707,10 @@ bool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS,
     }
   }
 
-  if (DSC != DSC_type_specifier && DSC != DSC_trailing) {
+  // Determine whether this identifier could plausibly be the name of something
+  // being declared (with a missign type).
+  if (DSC != DSC_type_specifier && DSC != DSC_trailing &&
+      (!SS || DSC == DSC_top_level || DSC == DSC_class)) {
     // Look ahead to the next token to try to figure out what this declaration
     // was supposed to be.
     switch (NextToken().getKind()) {
index 5f8d8caae698bc3e8a8d8fcccc58c375f681166f..7912fbec3f891ef612d9610d790f4e44a16bd5ab 100644 (file)
@@ -20,6 +20,8 @@ struct A {
   typedef T type;
   
   type f();
+
+  type g();
 };
 
 template<typename T>
@@ -27,3 +29,14 @@ A<T>::type g(T t) { return t; } // expected-error{{missing 'typename'}}
 
 template<typename T>
 A<T>::type A<T>::f() { return type(); } // expected-error{{missing 'typename'}}
+
+template<typename T>
+void f(int, T::type) { } // expected-error{{missing 'typename'}}
+
+template<typename T>
+void f(int, T::type, int) { } // expected-error{{missing 'typename'}}
+
+// FIXME: We know which type specifier should have been specified here. Provide
+//        a fix-it to add 'typename A<T>::type'
+template<typename T>
+A<T>::g() { } // expected-error{{requires a type specifier}}