summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-03-07 23:26:22 +0000
committerDouglas Gregor <dgregor@apple.com>2010-03-07 23:26:22 +0000
commit281c486e1bf02b9354a3781d861cebfbf877a75e (patch)
tree3496c918af923809ebd22717c627ca1b41b75090
parentc934bc840cb483a56da06bd9dbeff8bab32af84d (diff)
downloadllvm-281c486e1bf02b9354a3781d861cebfbf877a75e.tar.gz
Robustify callers that rebuild typename type nodes again NULL return
types. Fixes PR6463. llvm-svn: 97924
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp3
-rw-r--r--clang/lib/Sema/SemaTemplate.cpp3
-rw-r--r--clang/test/SemaTemplate/typename-specifier-4.cpp17
3 files changed, 23 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index b959202b8856..e32d14e1c87c 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -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();
}
}
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 03219580f92f..445b68b16767 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -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;
diff --git a/clang/test/SemaTemplate/typename-specifier-4.cpp b/clang/test/SemaTemplate/typename-specifier-4.cpp
index 0a6fef74c340..280a1b4c3957 100644
--- a/clang/test/SemaTemplate/typename-specifier-4.cpp
+++ b/clang/test/SemaTemplate/typename-specifier-4.cpp
@@ -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}}
+ }
+}