Thanks for taking care of it. It looks like I had to traverse the chain of Scopes upwards until Scope::getEntity() returns something that is not null.
This is a reduced test case. clang doesn’t crash if I remove “if (true)”. $ cat test1.cpp struct CmapSubtable {}; struct A { protected: typedef bool (*func_t)(); template <typename Type> static bool foo1() { return true; } public: void init() { if (true) func = foo1<CmapSubtable>; } func_t func; }; void foo1() { A a; a.init(); } > On Feb 16, 2018, at 4:08 AM, Hans Wennborg <h...@chromium.org> wrote: > > Reverted in r325335 as this broke the Chromium build. > > See https://bugs.chromium.org/p/chromium/issues/detail?id=813017 for > stack trace and reproducer. > > (I think Ben said it might have also broken a Clang bootstrap build, > but I didn't see that anywhere?) > > On Fri, Feb 16, 2018 at 9:47 AM, Akira Hatanaka via cfe-commits > <cfe-commits@lists.llvm.org> wrote: >> Author: ahatanak >> Date: Fri Feb 16 00:47:37 2018 >> New Revision: 325321 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=325321&view=rev >> Log: >> [Sema] Take into account the current context when checking the >> accessibility of a class member. >> >> This fixes PR32898. >> >> rdar://problem/33737747 >> >> Differential revision: https://reviews.llvm.org/D36918 >> >> Modified: >> cfe/trunk/lib/Sema/SemaAccess.cpp >> cfe/trunk/test/SemaCXX/access.cpp >> >> Modified: cfe/trunk/lib/Sema/SemaAccess.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaAccess.cpp?rev=325321&r1=325320&r2=325321&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaAccess.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaAccess.cpp Fri Feb 16 00:47:37 2018 >> @@ -1793,6 +1793,11 @@ Sema::AccessResult Sema::CheckAddressOfM >> >> AccessTarget Entity(Context, AccessTarget::Member, NamingClass, Found, >> /*no instance context*/ QualType()); >> + >> + if (IsAccessible(*this, EffectiveContext(CurScope->getEntity()), Entity) >> == >> + ::AR_accessible) >> + return AR_accessible; >> + >> Entity.setDiag(diag::err_access) >> << Ovl->getSourceRange(); >> >> >> Modified: cfe/trunk/test/SemaCXX/access.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/access.cpp?rev=325321&r1=325320&r2=325321&view=diff >> ============================================================================== >> --- cfe/trunk/test/SemaCXX/access.cpp (original) >> +++ cfe/trunk/test/SemaCXX/access.cpp Fri Feb 16 00:47:37 2018 >> @@ -169,3 +169,38 @@ namespace ThisLambdaIsNotMyFriend { >> } >> void bar() { foo<void>(); } >> } >> + >> +namespace OverloadedMemberFunctionPointer { >> + template<class T, void(T::*pMethod)()> >> + void func0() {} >> + >> + template<class T, void(T::*pMethod)(int)> >> + void func1() {} >> + >> + template<class T> >> + void func2(void(*fn)()) {} // expected-note 2 {{candidate function not >> viable: no overload of 'func}} >> + >> + class C { >> + private: >> + friend void friendFunc(); >> + void overloadedMethod(); >> + protected: >> + void overloadedMethod(int); >> + public: >> + void overloadedMethod(int, int); >> + void method() { >> + func2<int>(&func0<C, &C::overloadedMethod>); >> + func2<int>(&func1<C, &C::overloadedMethod>); >> + } >> + }; >> + >> + void friendFunc() { >> + func2<int>(&func0<C, &C::overloadedMethod>); >> + func2<int>(&func1<C, &C::overloadedMethod>); >> + } >> + >> + void nonFriendFunc() { >> + func2<int>(&func0<C, &C::overloadedMethod>); // expected-error {{no >> matching function for call to 'func2'}} >> + func2<int>(&func1<C, &C::overloadedMethod>); // expected-error {{no >> matching function for call to 'func2'}} >> + } >> +} >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits