[PATCH] Implementation of core DR580 and C++11 member access rules
Richard Smith
richard at metafoo.co.uk
Mon Apr 29 03:14:25 PDT 2013
Committed as r180707.
On Fri, Apr 26, 2013 at 3:31 PM, Ismail Pazarbasi <
ismail.pazarbasi at gmail.com> wrote:
> Thank you Richard,
>
> could you please commit this?
>
>
> On Fri, Apr 26, 2013 at 5:14 PM, Richard Smith <richard at metafoo.co.uk>wrote:
>
>> LGTM
>>
>>
>> On Mon, Apr 22, 2013 at 2:10 PM, Ismail Pazarbasi <
>> ismail.pazarbasi at gmail.com> wrote:
>>
>>> I have added a few test cases for alias templates, a function template
>>> - to ensure I didn't break it - and extended previous one slightly. I
>>> initially had a FIXME for alias templates, but removed it right before I
>>> submitted the patch. I can't find a way to access a private variable/field
>>> from an alias template context.
>>>
>>> Hi rsmith,
>>>
>>> http://llvm-reviews.chandlerc.com/D696
>>>
>>> CHANGE SINCE LAST DIFF
>>> http://llvm-reviews.chandlerc.com/D696?vs=1703&id=1718#toc
>>>
>>> Files:
>>> lib/Sema/SemaAccess.cpp
>>> test/SemaCXX/access.cpp
>>>
>>> Index: lib/Sema/SemaAccess.cpp
>>> ===================================================================
>>> --- lib/Sema/SemaAccess.cpp
>>> +++ lib/Sema/SemaAccess.cpp
>>> @@ -1487,7 +1487,7 @@
>>> if (!DC->isFunctionOrMethod())
>>> DC = FN;
>>> } else if (TemplateDecl *TD = dyn_cast<TemplateDecl>(D)) {
>>> - DC = dyn_cast<DeclContext>(TD->getTemplatedDecl());
>>> + DC = cast<DeclContext>(TD->getTemplatedDecl());
>>> }
>>>
>>> EffectiveContext EC(DC);
>>> Index: test/SemaCXX/access.cpp
>>> ===================================================================
>>> --- test/SemaCXX/access.cpp
>>> +++ test/SemaCXX/access.cpp
>>> @@ -35,24 +35,74 @@
>>>
>>> // PR15209
>>> namespace PR15209 {
>>> - class A {
>>> - typedef int I; // expected-note {{implicitly declared private
>>> here}}
>>> - template<int> friend struct B;
>>> - template<int> struct C;
>>> - template<int, typename T> friend struct E;
>>> - template<template<int> class T> friend struct TT;
>>> - static constexpr int x = 0;
>>> - };
>>> - template<A::I> struct B { };
>>> + namespace alias_templates {
>>> + template<typename T1, typename T2> struct U { };
>>> + template<typename T1> using W = U<T1, float>;
>>>
>>> - template<A::I> struct A::C { };
>>> + class A {
>>> + typedef int I;
>>> + static constexpr I x = 0; // expected-note {{implicitly declared
>>> private here}}
>>> + static constexpr I y = 42; // expected-note {{implicitly declared
>>> private here}}
>>> + friend W<int>;
>>> + };
>>>
>>> - template<A::I> struct D { }; // expected-error {{'I' is a private
>>> member of 'PR15209::A'}}
>>> + template<typename T1>
>>> + struct U<T1, float> {
>>> + int v_;
>>> + // the following will trigger for U<float, float> instantiation,
>>> via W<float>
>>> + U() : v_(A::x) { } // expected-error {{'x' is a private member of
>>> 'PR15209::alias_templates::A'}}
>>> + };
>>>
>>> - template<A::I, typename T> struct E { };
>>> + template<typename T1>
>>> + struct U<T1, int> {
>>> + int v_;
>>> + U() : v_(A::y) { } // expected-error {{'y' is a private member of
>>> 'PR15209::alias_templates::A'}}
>>> + };
>>>
>>> - template<template<A::I> class T> struct TT {
>>> - T<A::I(0)> t;
>>> - };
>>> - template struct TT<B>;
>>> + template struct U<int, int>; // expected-note {{in instantiation of
>>> member function 'PR15209::alias_templates::U<int, int>::U' requested here}}
>>> +
>>> + void f()
>>> + {
>>> + W<int>();
>>> + // we should issue diagnostics for the following
>>> + W<float>(); // expected-note {{in instantiation of member
>>> function 'PR15209::alias_templates::U<float, float>::U' requested here}}
>>> + }
>>> + }
>>> +
>>> + namespace templates {
>>> + class A {
>>> + typedef int I; // expected-note {{implicitly declared private
>>> here}}
>>> + static constexpr I x = 0; // expected-note {{implicitly declared
>>> private here}}
>>> +
>>> + template<int> friend struct B;
>>> + template<int> struct C;
>>> + template<template<int> class T> friend struct TT;
>>> + template<typename T> friend void funct(T);
>>> + };
>>> + template<A::I> struct B { };
>>> +
>>> + template<A::I> struct A::C { };
>>> +
>>> + template<template<A::I> class T> struct TT {
>>> + T<A::x> t;
>>> + };
>>> +
>>> + template struct TT<B>;
>>> + template<A::I> struct D { }; // expected-error {{'I' is a private
>>> member of 'PR15209::templates::A'}}
>>> + template struct TT<D>;
>>> +
>>> + // function template case
>>> + template<typename T>
>>> + void funct(T)
>>> + {
>>> + (void)A::x;
>>> + }
>>> +
>>> + template void funct<int>(int);
>>> +
>>> + void f()
>>> + {
>>> + (void)A::x; // expected-error {{'x' is a private member of
>>> 'PR15209::templates::A'}}
>>> + }
>>> + }
>>> }
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130429/56eefa71/attachment.html>
More information about the cfe-commits
mailing list