On Tue, Feb 16, 2016 at 5:38 AM, Markus Trippelsdorf
<mar...@trippelsdorf.de> wrote:
> On 2016.02.15 at 16:13 -0500, Jason Merrill wrote:
>> When we stopped finding function templates with unqualified lookup due to
>> the DR141 fix, that exposed bugs in our lookup within the object expression
>> scope; an object-expression of the current instantiation does not make the
>> expression dependent.  This patch fixes this issue specifically for implicit
>> "this->", which is the case in question in this PR; addressing this issue
>> more generally will take more work.
>>
>> Tested x86_64-pc-linux-gnu, applying to trunk.
>
>> diff --git a/gcc/testsuite/g++.dg/lookup/member3.C 
>> b/gcc/testsuite/g++.dg/lookup/member3.C
>> new file mode 100644
>> index 0000000..f4e097e4
>> --- /dev/null
>> +++ b/gcc/testsuite/g++.dg/lookup/member3.C
>> @@ -0,0 +1,17 @@
>> +// PR c++/69753
>> +// { dg-do compile { target c++11 } }
>> +
>> +class A {
>> +public:
>> +  template <typename> void As();
>> +  static A *FromWebContents();
>> +  A *FromWebContents2();
>> +};
>> +template <typename T> class B : A {
>> +  void FromWebContents() {
>> +    auto guest = A::FromWebContents();
>> +    guest ? guest->As<T>() : nullptr;
>> +    auto guest2 = A::FromWebContents2();
>> +    guest2 ? guest2->As<T>() : nullptr;
>> +  }
>> +};
>
> Please note that clang rejects the testcase in the non static case:
>
> gcc/testsuite/g++.dg/lookup/member3.C:15:22: error: use 'template' keyword to 
> treat 'As' as a dependent template name
>     guest2 ? guest2->As<T>() : nullptr;
>                      ^
>                      template
> 1 error generated.
>
> Here is another testcase that every compiler I've tested (clang, icc,
> microsoft) accepts, but is rejected by gcc-6:
>
> class A {
> public:
>   template <class> void m_fn1();
> };
> A *fn1(int *);
> template <typename> class B : A {
>   static int *m_fn2() { fn1(m_fn2())->m_fn1<A>(); }
> };
>
> --
> Markus

clang also rejects the case where A::FromWebContents is overloaded
with a static member function and non-static one, and gcc now accepts
this case.

class A {
public:
  template <typename> void As();
  static A *FromWebContents();
  template <typename... Ts>
  A *FromWebContents(Ts...);
};
template <typename T> class B : A {
  void FromWebContents() {
    auto guest = A::FromWebContents();
    guest->As<T>();
  }
};

Reply via email to