C++ PATCH for c++/69753 (DR141 broke member template lookup)
Patrick Palka
patrick@parcs.ath.cx
Tue Feb 16 14:33:00 GMT 2016
On Tue, Feb 16, 2016 at 5:38 AM, Markus Trippelsdorf
<markus@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>();
}
};
More information about the Gcc-patches
mailing list