Work around a crash when checking access to injected class names
qua templates. The current fix suppresses the access check entirely in this case; to do better, we'd need to be able to say that a particular lookup result came from a particular injected class name, which is not easy to do with the current representation of LookupResult. This is on my known-problems list. llvm-svn: 111009
This commit is contained in:
parent
49fd7d3a5f
commit
bd8062dff1
|
@ -88,8 +88,13 @@ static void FilterAcceptableTemplateNames(ASTContext &C, LookupResult &R) {
|
|||
filter.erase();
|
||||
continue;
|
||||
}
|
||||
|
||||
filter.replace(Repl);
|
||||
|
||||
// FIXME: we promote access to public here as a workaround to
|
||||
// the fact that LookupResult doesn't let us remember that we
|
||||
// found this template through a particular injected class name,
|
||||
// which means we end up doing nasty things to the invariants.
|
||||
// Pretending that access is public is *much* safer.
|
||||
filter.replace(Repl, AS_public);
|
||||
}
|
||||
}
|
||||
filter.done();
|
||||
|
|
|
@ -436,3 +436,17 @@ namespace test17 {
|
|||
|
||||
A::Inner<int> s; // expected-error {{'Inner' is a private member of 'test17::A'}}
|
||||
}
|
||||
|
||||
namespace test18 {
|
||||
template <class T> class A {};
|
||||
class B : A<int> {
|
||||
A<int> member;
|
||||
};
|
||||
|
||||
// FIXME: this access to A should be forbidden (because C++ is dumb),
|
||||
// but LookupResult can't express the necessary information to do
|
||||
// the check, so we aggressively suppress access control.
|
||||
class C : B {
|
||||
A<int> member;
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue