1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li class C { 4*67e74705SXin Li struct S; // expected-note {{previously declared 'private' here}} 5*67e74705SXin Li public: 6*67e74705SXin Li 7*67e74705SXin Li struct S {}; // expected-error {{'S' redeclared with 'public' access}} 8*67e74705SXin Li }; 9*67e74705SXin Li 10*67e74705SXin Li struct S { 11*67e74705SXin Li class C; // expected-note {{previously declared 'public' here}} 12*67e74705SXin Li 13*67e74705SXin Li private: 14*67e74705SXin Li class C { }; // expected-error {{'C' redeclared with 'private' access}} 15*67e74705SXin Li }; 16*67e74705SXin Li 17*67e74705SXin Li class T { 18*67e74705SXin Li protected: 19*67e74705SXin Li template<typename T> struct A; // expected-note {{previously declared 'protected' here}} 20*67e74705SXin Li 21*67e74705SXin Li private: 22*67e74705SXin Li template<typename T> struct A {}; // expected-error {{'A' redeclared with 'private' access}} 23*67e74705SXin Li }; 24*67e74705SXin Li 25*67e74705SXin Li // PR5573 26*67e74705SXin Li namespace test1 { 27*67e74705SXin Li class A { 28*67e74705SXin Li private: 29*67e74705SXin Li class X; // expected-note {{previously declared 'private' here}} \ 30*67e74705SXin Li // expected-note {{previous declaration is here}} 31*67e74705SXin Li public: 32*67e74705SXin Li class X; // expected-error {{'X' redeclared with 'public' access}} \ 33*67e74705SXin Li // expected-warning {{class member cannot be redeclared}} 34*67e74705SXin Li class X {}; 35*67e74705SXin Li }; 36*67e74705SXin Li } 37*67e74705SXin Li 38*67e74705SXin Li // PR15209 39*67e74705SXin Li namespace PR15209 { 40*67e74705SXin Li namespace alias_templates { 41*67e74705SXin Li template<typename T1, typename T2> struct U { }; 42*67e74705SXin Li template<typename T1> using W = U<T1, float>; 43*67e74705SXin Li 44*67e74705SXin Li class A { 45*67e74705SXin Li typedef int I; 46*67e74705SXin Li static constexpr I x = 0; // expected-note {{implicitly declared private here}} 47*67e74705SXin Li static constexpr I y = 42; // expected-note {{implicitly declared private here}} 48*67e74705SXin Li friend W<int>; 49*67e74705SXin Li }; 50*67e74705SXin Li 51*67e74705SXin Li template<typename T1> 52*67e74705SXin Li struct U<T1, float> { 53*67e74705SXin Li int v_; 54*67e74705SXin Li // the following will trigger for U<float, float> instantiation, via W<float> UPR15209::alias_templates::U55*67e74705SXin Li U() : v_(A::x) { } // expected-error {{'x' is a private member of 'PR15209::alias_templates::A'}} 56*67e74705SXin Li }; 57*67e74705SXin Li 58*67e74705SXin Li template<typename T1> 59*67e74705SXin Li struct U<T1, int> { 60*67e74705SXin Li int v_; UPR15209::alias_templates::U61*67e74705SXin Li U() : v_(A::y) { } // expected-error {{'y' is a private member of 'PR15209::alias_templates::A'}} 62*67e74705SXin Li }; 63*67e74705SXin Li 64*67e74705SXin Li template struct U<int, int>; // expected-note {{in instantiation of member function 'PR15209::alias_templates::U<int, int>::U' requested here}} 65*67e74705SXin Li f()66*67e74705SXin Li void f() 67*67e74705SXin Li { 68*67e74705SXin Li W<int>(); 69*67e74705SXin Li // we should issue diagnostics for the following 70*67e74705SXin Li W<float>(); // expected-note {{in instantiation of member function 'PR15209::alias_templates::U<float, float>::U' requested here}} 71*67e74705SXin Li } 72*67e74705SXin Li } 73*67e74705SXin Li 74*67e74705SXin Li namespace templates { 75*67e74705SXin Li class A { 76*67e74705SXin Li typedef int I; // expected-note {{implicitly declared private here}} 77*67e74705SXin Li static constexpr I x = 0; // expected-note {{implicitly declared private here}} 78*67e74705SXin Li 79*67e74705SXin Li template<int> friend struct B; 80*67e74705SXin Li template<int> struct C; 81*67e74705SXin Li template<template<int> class T> friend struct TT; 82*67e74705SXin Li template<typename T> friend void funct(T); 83*67e74705SXin Li }; 84*67e74705SXin Li template<A::I> struct B { }; 85*67e74705SXin Li 86*67e74705SXin Li template<A::I> struct A::C { }; 87*67e74705SXin Li 88*67e74705SXin Li template<template<A::I> class T> struct TT { 89*67e74705SXin Li T<A::x> t; 90*67e74705SXin Li }; 91*67e74705SXin Li 92*67e74705SXin Li template struct TT<B>; 93*67e74705SXin Li template<A::I> struct D { }; // expected-error {{'I' is a private member of 'PR15209::templates::A'}} 94*67e74705SXin Li template struct TT<D>; 95*67e74705SXin Li 96*67e74705SXin Li // function template case 97*67e74705SXin Li template<typename T> funct(T)98*67e74705SXin Li void funct(T) 99*67e74705SXin Li { 100*67e74705SXin Li (void)A::x; 101*67e74705SXin Li } 102*67e74705SXin Li 103*67e74705SXin Li template void funct<int>(int); 104*67e74705SXin Li f()105*67e74705SXin Li void f() 106*67e74705SXin Li { 107*67e74705SXin Li (void)A::x; // expected-error {{'x' is a private member of 'PR15209::templates::A'}} 108*67e74705SXin Li } 109*67e74705SXin Li } 110*67e74705SXin Li } 111*67e74705SXin Li 112*67e74705SXin Li namespace PR7434 { 113*67e74705SXin Li namespace comment0 { 114*67e74705SXin Li template <typename T> struct X; 115*67e74705SXin Li namespace N { 116*67e74705SXin Li class Y { 117*67e74705SXin Li template<typename T> friend struct X; 118*67e74705SXin Li int t; // expected-note {{here}} 119*67e74705SXin Li }; 120*67e74705SXin Li } 121*67e74705SXin Li template<typename T> struct X { XPR7434::comment0::X122*67e74705SXin Li X() { (void)N::Y().t; } // expected-error {{private}} 123*67e74705SXin Li }; 124*67e74705SXin Li X<char> x; 125*67e74705SXin Li } 126*67e74705SXin Li namespace comment2 { 127*67e74705SXin Li struct X; 128*67e74705SXin Li namespace N { 129*67e74705SXin Li class Y { 130*67e74705SXin Li friend struct X; 131*67e74705SXin Li int t; // expected-note {{here}} 132*67e74705SXin Li }; 133*67e74705SXin Li } 134*67e74705SXin Li struct X { XPR7434::comment2::X135*67e74705SXin Li X() { (void)N::Y().t; } // expected-error {{private}} 136*67e74705SXin Li }; 137*67e74705SXin Li } 138*67e74705SXin Li } 139*67e74705SXin Li 140*67e74705SXin Li namespace LocalExternVar { 141*67e74705SXin Li class test { 142*67e74705SXin Li private: 143*67e74705SXin Li struct private_struct { // expected-note 2{{here}} 144*67e74705SXin Li int x; 145*67e74705SXin Li }; 146*67e74705SXin Li int use_private(); 147*67e74705SXin Li }; 148*67e74705SXin Li use_private()149*67e74705SXin Li int test::use_private() { 150*67e74705SXin Li extern int array[sizeof(test::private_struct)]; // ok 151*67e74705SXin Li return array[0]; 152*67e74705SXin Li } 153*67e74705SXin Li f()154*67e74705SXin Li int f() { 155*67e74705SXin Li extern int array[sizeof(test::private_struct)]; // expected-error {{private}} 156*67e74705SXin Li return array[0]; 157*67e74705SXin Li } 158*67e74705SXin Li 159*67e74705SXin Li int array[sizeof(test::private_struct)]; // expected-error {{private}} 160*67e74705SXin Li } 161*67e74705SXin Li 162*67e74705SXin Li namespace ThisLambdaIsNotMyFriend { 163*67e74705SXin Li class A { 164*67e74705SXin Li friend class D; 165*67e74705SXin Li static void foo(); // expected-note {{here}} 166*67e74705SXin Li }; foo()167*67e74705SXin Li template <class T> void foo() { 168*67e74705SXin Li []() { A::foo(); }(); // expected-error {{private}} 169*67e74705SXin Li } bar()170*67e74705SXin Li void bar() { foo<void>(); } 171*67e74705SXin Li } 172