[PATCH] Implementation of core DR580 and C++11 member access rules
Ismail Pazarbasi
ismail.pazarbasi at gmail.com
Fri Apr 26 15:31:15 PDT 2013
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/20130427/81a020a4/attachment.html>
More information about the cfe-commits
mailing list