LGTM
On Mon, Apr 22, 2013 at 2:10 PM, Ismail Pazarbasi < [email protected]> 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'}} > + } > + } > } >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
