r325321 - [Sema] Take into account the current context when checking the

Akira Hatanaka via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 16 13:20:07 PST 2018


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 <hans at 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 at 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list