mirror of
https://github.com/intel/llvm.git
synced 2026-02-04 03:26:06 +08:00
When tag lookup finds something ambiguous, and we're defining a new
tag, filter out those ambiguous names that we found if they aren't within the declaration context where this newly-defined tag will be visible. This is basically a hack, because we really need to fix the lookup of tag declarations in this case to not find things it shouldn't. However, it's better than what we had before, and it fixes <rdar://problem/9168556>. llvm-svn: 130810
This commit is contained in:
@@ -6715,6 +6715,19 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
|
||||
// shouldn't be diagnosing.
|
||||
LookupName(Previous, S);
|
||||
|
||||
if (Previous.isAmbiguous() && TUK == TUK_Definition) {
|
||||
LookupResult::Filter F = Previous.makeFilter();
|
||||
while (F.hasNext()) {
|
||||
NamedDecl *ND = F.next();
|
||||
if (ND->getDeclContext()->getRedeclContext() != SearchDC)
|
||||
F.erase();
|
||||
}
|
||||
F.done();
|
||||
|
||||
if (Previous.isAmbiguous())
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Note: there used to be some attempt at recovery here.
|
||||
if (Previous.isAmbiguous())
|
||||
return 0;
|
||||
|
||||
17
clang/test/SemaCXX/tag-ambig.cpp
Normal file
17
clang/test/SemaCXX/tag-ambig.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
// <rdar://problem/9168556>
|
||||
typedef struct Point Point;
|
||||
|
||||
namespace NameSpace {
|
||||
class Point;
|
||||
}
|
||||
|
||||
using namespace NameSpace;
|
||||
|
||||
class Test
|
||||
{
|
||||
public:
|
||||
struct Point { };
|
||||
virtual bool testMethod (Test::Point& p) = 0;
|
||||
};
|
||||
Reference in New Issue
Block a user