Committed as r180707.
On Fri, Apr 26, 2013 at 3:31 PM, Ismail Pazarbasi < [email protected]> wrote: > Thank you Richard, > > could you please commit this? > > > On Fri, Apr 26, 2013 at 5:14 PM, Richard Smith <[email protected]>wrote: > >> 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
