From: John McCall Date: Fri, 13 Aug 2010 07:02:08 +0000 (+0000) Subject: Work around a crash when checking access to injected class names X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8ba6691248004e1a726ba5f29d717950f8054507;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111009 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index ba697fb398..378c789273 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -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(); diff --git a/test/CXX/class.access/p4.cpp b/test/CXX/class.access/p4.cpp index b0c33606f1..fa6e183890 100644 --- a/test/CXX/class.access/p4.cpp +++ b/test/CXX/class.access/p4.cpp @@ -436,3 +436,17 @@ namespace test17 { A::Inner s; // expected-error {{'Inner' is a private member of 'test17::A'}} } + +namespace test18 { + template class A {}; + class B : A { + A 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 member; + }; +}