aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-08-28 20:17:00 +0000
committerJohn McCall <rjmccall@apple.com>2010-08-28 20:17:00 +0000
commit67d22fb57ecccd29ea9c8ec004f63dc356cd477d (patch)
tree1da82a9d5b3e5aa29ec214d08608f708a8e2c0a8
parent91c83e76d8ad42d1fd8e249b72a36d552997f77c (diff)
If filtering a lookup result leaves it ambiguous, keep the ambiguity
kind. Fixes PR7252. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112383 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Sema/Lookup.h9
-rw-r--r--lib/Sema/SemaTemplate.cpp7
-rw-r--r--test/SemaTemplate/temp.cpp18
3 files changed, 29 insertions, 5 deletions
diff --git a/include/clang/Sema/Lookup.h b/include/clang/Sema/Lookup.h
index c9b090ae22..1c7720abb1 100644
--- a/include/clang/Sema/Lookup.h
+++ b/include/clang/Sema/Lookup.h
@@ -366,10 +366,15 @@ public:
if (ResultKind != NotFoundInCurrentInstantiation)
ResultKind = NotFound;
} else {
+ AmbiguityKind SavedAK = Ambiguity;
ResultKind = Found;
resolveKind();
-
- if (Paths && (ResultKind != Ambiguous)) {
+
+ // If we didn't make the lookup unambiguous, restore the old
+ // ambiguity kind.
+ if (ResultKind == Ambiguous) {
+ Ambiguity = SavedAK;
+ } else if (Paths) {
deletePaths(Paths);
Paths = 0;
}
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index 09656bcd91..2cbf3073a4 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -141,8 +141,13 @@ TemplateNameKind Sema::isTemplateName(Scope *S,
LookupOrdinaryName);
LookupTemplateName(R, S, SS, ObjectType, EnteringContext,
MemberOfUnknownSpecialization);
- if (R.empty() || R.isAmbiguous()) {
+ if (R.empty()) return TNK_Non_template;
+ if (R.isAmbiguous()) {
+ // Suppress diagnostics; we'll redo this lookup later.
R.suppressDiagnostics();
+
+ // FIXME: we might have ambiguous templates, in which case we
+ // should at least parse them properly!
return TNK_Non_template;
}
diff --git a/test/SemaTemplate/temp.cpp b/test/SemaTemplate/temp.cpp
index 961b9c873a..e037f0f071 100644
--- a/test/SemaTemplate/temp.cpp
+++ b/test/SemaTemplate/temp.cpp
@@ -1,5 +1,19 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
-// p3
-template<typename T> int foo(T), bar(T, T); // expected-error{{single entity}}
+namespace test0 {
+ // p3
+ template<typename T> int foo(T), bar(T, T); // expected-error{{single entity}}
+}
+
+// PR7252
+namespace test1 {
+ namespace A { template<typename T> struct Base { typedef T t; }; } // expected-note {{member found}}
+ namespace B { template<typename T> struct Base { typedef T t; }; } // expected-note {{member found}}
+
+ template<typename T> struct Derived : A::Base<char>, B::Base<int> {
+ // FIXME: the syntax error here is unfortunate
+ typename Derived::Base<float>::t x; // expected-error {{found in multiple base classes of different types}} \
+ // expected-error {{expected member name or ';'}}
+ };
+}