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
This commit is contained in:
John McCall 2010-08-28 20:17:00 +00:00
parent 91c83e76d8
commit 67d22fb57e
3 changed files with 29 additions and 5 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 ';'}}
};
}