]> granicus.if.org Git - clang/commitdiff
Patch for PR 7409 - only error on definition of invalid typedefs. Suppress errors...
authorRichard Trieu <rtrieu@google.com>
Sat, 7 May 2011 01:36:37 +0000 (01:36 +0000)
committerRichard Trieu <rtrieu@google.com>
Sat, 7 May 2011 01:36:37 +0000 (01:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131043 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaTemplate/typename-specifier.cpp

index da60fccf7ed4380e3e640efb399efc23a2631831..c45d02a56c6d3c00772164b46370cba29d9933e6 100644 (file)
@@ -2568,9 +2568,13 @@ TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
                   Q.getLocalEndLoc());
         break;
       }
-      
-      SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 
-        << TL.getType() << SS.getRange();
+      // If the nested-name-specifier is an invalid type def, don't emit an
+      // error because a previous error should have already been emitted.
+      TypedefTypeLoc* TTL = dyn_cast<TypedefTypeLoc>(&TL);
+      if (!TTL || !TTL->getTypedefNameDecl()->isInvalidDecl()) {
+        SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 
+          << TL.getType() << SS.getRange();
+      }
       return NestedNameSpecifierLoc();
     }
     }
index 4c788f6a8a3cdad18b2f27c1a38375bb1a534b4d..7898a20d6e17eea23e3c6cf7e9f9cbfdb2d46f3e 100644 (file)
@@ -71,3 +71,34 @@ struct C {
 ::Y<A>::type ip7 = &i;
 ::Y<B>::type ip8 = &i; // expected-note{{in instantiation of template class 'Y<B>' requested here}}
 ::Y<C>::type ip9 = &i; // expected-note{{in instantiation of template class 'Y<C>' requested here}}
+
+template<typename T> struct D {
+  typedef typename T::foo foo;  // expected-error {{type 'long' cannot be used prior to '::' because it has no members}}
+  typedef typename foo::bar bar;
+};
+
+D<long> struct_D;  // expected-note {{in instantiation of template class 'D<long>' requested here}}
+
+template<typename T> struct E {
+  typedef typename T::foo foo;
+  typedef typename foo::bar bar;  // expected-error {{type 'foo' (aka 'double') cannot be used prior to '::' because it has no members}}
+};
+
+struct F {
+  typedef double foo;
+};
+
+E<F> struct_E; // expected-note {{in instantiation of template class 'E<F>' requested here}}
+
+template<typename T> struct G {
+  typedef typename T::foo foo;
+  typedef typename foo::bar bar;
+};
+
+struct H {
+  struct foo {
+    typedef double bar;
+  };
+};
+
+G<H> struct_G;