]> granicus.if.org Git - clang/commitdiff
Robustify callers that rebuild typename type nodes again NULL return
authorDouglas Gregor <dgregor@apple.com>
Sun, 7 Mar 2010 23:26:22 +0000 (23:26 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 7 Mar 2010 23:26:22 +0000 (23:26 +0000)
types. Fixes PR6463.

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

lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaTemplate.cpp
test/SemaTemplate/typename-specifier-4.cpp

index b959202b88562d05cab228afd963d9ce8cb9693d..e32d14e1c87c353dc740b7c9b2a2ca863d2c6159 100644 (file)
@@ -1083,6 +1083,9 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD,
           // specialization, we take it as a type name.
           BaseType = CheckTypenameType((NestedNameSpecifier *)SS.getScopeRep(),
                                        *MemberOrBase, SS.getRange());
+          if (BaseType.isNull())
+            return true;
+
           R.clear();
         }
       }
index 03219580f92f3ae76df95f7347be4b38a6c24737..445b68b1676717c61cc432d01c671ae20f36fc81 100644 (file)
@@ -4992,6 +4992,9 @@ CurrentInstantiationRebuilder::TransformTypenameType(TypeLocBuilder &TLB,
     Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(),
                                               SourceRange(TL.getNameLoc()));
 
+  if (Result.isNull())
+    return QualType();
+
   TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
   NewTL.setNameLoc(TL.getNameLoc());
   return Result;
index 0a6fef74c340331819c6c969732cf3e7404d9b56..280a1b4c39573140fbd2e234443c96abcb7df6e1 100644 (file)
@@ -99,3 +99,20 @@ namespace PR6268 {
     return Inner<U>();
   }
 }
+
+namespace PR6463 {
+  struct B { typedef int type; }; // expected-note 2{{member found by ambiguous name lookup}}
+  struct C { typedef int type; }; // expected-note 2{{member found by ambiguous name lookup}}
+
+  template<typename T>
+  struct A : B, C { 
+    type& a(); // expected-error{{found in multiple base classes}}
+    int x; 
+  };
+
+  // FIXME: Improve source location info here.
+  template<typename T>
+  typename A<T>::type& A<T>::a() { // expected-error{{found in multiple base classes}}
+    return x;  // expected-error{{undeclared identifier}}
+  }
+}