| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
| |
| class C { |
| struct S; // expected-note {{previously declared 'private' here}} |
| public: |
| |
| struct S {}; // expected-error {{'S' redeclared with 'public' access}} |
| }; |
| |
| struct S { |
| class C; // expected-note {{previously declared 'public' here}} |
| |
| private: |
| class C { }; // expected-error {{'C' redeclared with 'private' access}} |
| }; |
| |
| class T { |
| protected: |
| template<typename T> struct A; // expected-note {{previously declared 'protected' here}} |
| |
| private: |
| template<typename T> struct A {}; // expected-error {{'A' redeclared with 'private' access}} |
| }; |
| |
| // PR5573 |
| namespace test1 { |
| class A { |
| private: |
| class X; // expected-note {{previously declared 'private' here}} \ |
| // expected-note {{previous declaration is here}} |
| public: |
| class X; // expected-error {{'X' redeclared with 'public' access}} \ |
| // expected-warning {{class member cannot be redeclared}} |
| class X {}; |
| }; |
| } |
| |
| // PR15209 |
| namespace PR15209 { |
| namespace alias_templates { |
| template<typename T1, typename T2> struct U { }; |
| template<typename T1> using W = U<T1, float>; |
| |
| 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<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<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 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'}} |
| } |
| } |
| } |
| |
| namespace PR7434 { |
| namespace comment0 { |
| template <typename T> struct X; |
| namespace N { |
| class Y { |
| template<typename T> friend struct X; |
| int t; // expected-note {{here}} |
| }; |
| } |
| template<typename T> struct X { |
| X() { (void)N::Y().t; } // expected-error {{private}} |
| }; |
| X<char> x; |
| } |
| namespace comment2 { |
| struct X; |
| namespace N { |
| class Y { |
| friend struct X; |
| int t; // expected-note {{here}} |
| }; |
| } |
| struct X { |
| X() { (void)N::Y().t; } // expected-error {{private}} |
| }; |
| } |
| } |
| |
| namespace LocalExternVar { |
| class test { |
| private: |
| struct private_struct { // expected-note 2{{here}} |
| int x; |
| }; |
| int use_private(); |
| }; |
| |
| int test::use_private() { |
| extern int array[sizeof(test::private_struct)]; // ok |
| return array[0]; |
| } |
| |
| int f() { |
| extern int array[sizeof(test::private_struct)]; // expected-error {{private}} |
| return array[0]; |
| } |
| |
| int array[sizeof(test::private_struct)]; // expected-error {{private}} |
| } |
| |
| namespace ThisLambdaIsNotMyFriend { |
| class A { |
| friend class D; |
| static void foo(); // expected-note {{here}} |
| }; |
| template <class T> void foo() { |
| []() { A::foo(); }(); // expected-error {{private}} |
| } |
| void bar() { foo<void>(); } |
| } |
| |
| namespace OverloadedMemberFunctionPointer { |
| template<class T, void(T::*pMethod)()> |
| void func0() {} |
| |
| template<class T, void(T::*pMethod)(int)> |
| void func1() {} |
| |
| template<class T> |
| void func2(void(*fn)()) {} // expected-note 2 {{candidate function template not viable: no overload of 'func}} |
| |
| class C { |
| private: |
| friend void friendFunc(); |
| void overloadedMethod(); |
| protected: |
| void overloadedMethod(int); |
| public: |
| void overloadedMethod(int, int); |
| void method() { |
| func2<int>(&func0<C, &C::overloadedMethod>); |
| func2<int>(&func1<C, &C::overloadedMethod>); |
| } |
| }; |
| |
| void friendFunc() { |
| func2<int>(&func0<C, &C::overloadedMethod>); |
| func2<int>(&func1<C, &C::overloadedMethod>); |
| } |
| |
| void nonFriendFunc() { |
| func2<int>(&func0<C, &C::overloadedMethod>); // expected-error {{no matching function for call to 'func2'}} |
| func2<int>(&func1<C, &C::overloadedMethod>); // expected-error {{no matching function for call to 'func2'}} |
| } |
| |
| // r325321 caused an assertion failure when the following code was compiled. |
| class A { |
| template <typename Type> static bool foo1() { return true; } |
| |
| public: |
| void init(bool c) { |
| if (c) { |
| auto f = foo1<int>; |
| } |
| } |
| }; |
| } |