mirror of https://github.com/microsoft/clang.git
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:
parent
91c83e76d8
commit
67d22fb57e
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ';'}}
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue