dr1xx.cpp revision 662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ff
1ed7dc87192784841839908a88b6d0623f6278408Richard Smith// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2ed7dc87192784841839908a88b6d0623f6278408Richard Smith// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 3ed7dc87192784841839908a88b6d0623f6278408Richard Smith// RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 4ed7dc87192784841839908a88b6d0623f6278408Richard Smith 5ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr100 { // dr100: yes 6ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<const char *> struct A {}; // expected-note {{declared here}} 7ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<const char (&)[4]> struct B {}; // expected-note {{declared here}} 8ed7dc87192784841839908a88b6d0623f6278408Richard Smith A<"foo"> a; // expected-error {{does not refer to any declaration}} 9ed7dc87192784841839908a88b6d0623f6278408Richard Smith B<"bar"> b; // expected-error {{does not refer to any declaration}} 10ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 11ed7dc87192784841839908a88b6d0623f6278408Richard Smith 12662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smithnamespace dr101 { // dr101: yes 13662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith extern "C" void dr101_f(); 14ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef unsigned size_t; 15ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace X { 16662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith extern "C" void dr101_f(); 17ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef unsigned size_t; 18ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 19662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith using X::dr101_f; 20ed7dc87192784841839908a88b6d0623f6278408Richard Smith using X::size_t; 21ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 22ed7dc87192784841839908a88b6d0623f6278408Richard Smith 23ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr102 { // dr102: yes 24ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace A { 25ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> T f(T a, T b) { return a + b; } // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} 26ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 27ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace B { 28ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct S {}; 29ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 30ed7dc87192784841839908a88b6d0623f6278408Richard Smith B::S operator+(B::S, B::S); // expected-note {{should be declared prior to the call site or in namespace 'dr102::B'}} 31ed7dc87192784841839908a88b6d0623f6278408Richard Smith template B::S A::f(B::S, B::S); // expected-note {{in instantiation of}} 32ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 33ed7dc87192784841839908a88b6d0623f6278408Richard Smith 34ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr103: na 35ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr104 FIXME: add codegen test 36ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr105: na 37ed7dc87192784841839908a88b6d0623f6278408Richard Smith 38ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr106 { // dr106: sup 540 39ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef int &r1; 40ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef r1 &r1; 41ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef const r1 r1; 42ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef const r1 &r1; 43ed7dc87192784841839908a88b6d0623f6278408Richard Smith 44ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef const int &r2; 45ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef r2 &r2; 46ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef const r2 r2; 47ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef const r2 &r2; 48ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 49ed7dc87192784841839908a88b6d0623f6278408Richard Smith 50ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr107 { // dr107: yes 51ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct S {}; 52ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern "C" S operator+(S, S) { return S(); } 53ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 54ed7dc87192784841839908a88b6d0623f6278408Richard Smith 55ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr108 { // dr108: yes 56ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct A { 57ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B { typedef int X; }; 58ed7dc87192784841839908a88b6d0623f6278408Richard Smith B::X x; // expected-error {{missing 'typename'}} 59ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct C : B { X x; }; // expected-error {{unknown type name}} 60ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 61ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<> struct A<int>::B { int X; }; 62ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 63ed7dc87192784841839908a88b6d0623f6278408Richard Smith 64ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr109 { // dr109: yes 65ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { template<typename T> void f(T); }; 66ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct B : T { 67ed7dc87192784841839908a88b6d0623f6278408Richard Smith using T::template f; // expected-error {{using declaration can not refer to a template}} 68ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { this->f<int>(123); } // expected-error {{use 'template'}} 69ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 70ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 71ed7dc87192784841839908a88b6d0623f6278408Richard Smith 72ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr111 { // dr111: dup 535 73ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { A(); A(volatile A&, int = 0); A(A&, const char * = "foo"); }; 74ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B : A { B(); }; // expected-note {{would lose const qualifier}} expected-note {{requires 0 arguments}} 75ed7dc87192784841839908a88b6d0623f6278408Richard Smith const B b1; 76ed7dc87192784841839908a88b6d0623f6278408Richard Smith B b2(b1); // expected-error {{no matching constructor}} 77ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 78ed7dc87192784841839908a88b6d0623f6278408Richard Smith 79ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr112 { // dr112: yes 80ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct T { int n; }; 81ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef T Arr[1]; 82ed7dc87192784841839908a88b6d0623f6278408Richard Smith 83ed7dc87192784841839908a88b6d0623f6278408Richard Smith const T a1[1] = {}; 84ed7dc87192784841839908a88b6d0623f6278408Richard Smith volatile T a2[1] = {}; 85ed7dc87192784841839908a88b6d0623f6278408Richard Smith const Arr a3 = {}; 86ed7dc87192784841839908a88b6d0623f6278408Richard Smith volatile Arr a4 = {}; 87ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<const volatile T*> struct X {}; 88ed7dc87192784841839908a88b6d0623f6278408Richard Smith X<a1> x1; 89ed7dc87192784841839908a88b6d0623f6278408Richard Smith X<a2> x2; 90ed7dc87192784841839908a88b6d0623f6278408Richard Smith X<a3> x3; 91ed7dc87192784841839908a88b6d0623f6278408Richard Smith X<a4> x4; 92ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L 93ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-error@-5 {{internal linkage}} expected-note@-10 {{here}} 94ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-error@-4 {{internal linkage}} expected-note@-9 {{here}} 95ed7dc87192784841839908a88b6d0623f6278408Richard Smith#else 96ed7dc87192784841839908a88b6d0623f6278408Richard Smith // FIXME: Test this somehow. 97ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 98ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 99ed7dc87192784841839908a88b6d0623f6278408Richard Smith 100ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr113 { // dr113: yes 101ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern void (*p)(); 102ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f() { 103ed7dc87192784841839908a88b6d0623f6278408Richard Smith no_such_function(); // expected-error {{undeclared}} 104ed7dc87192784841839908a88b6d0623f6278408Richard Smith p(); 105ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 106ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(); 107ed7dc87192784841839908a88b6d0623f6278408Richard Smith void (*p)() = &g; 108ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 109ed7dc87192784841839908a88b6d0623f6278408Richard Smith 110ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr114 { // dr114: yes 111ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 112ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void f(int) = 0; // expected-note {{unimplemented}} 113ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 114ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B : A { 115ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(T); 116ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { f(0); } 117ed7dc87192784841839908a88b6d0623f6278408Richard Smith } b; // expected-error {{abstract}} 118ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 119ed7dc87192784841839908a88b6d0623f6278408Richard Smith 120ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr115 { // dr115: yes 121ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int f(T); // expected-note +{{}} 122ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int g(T); // expected-note +{{}} 123ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int g(T, int); // expected-note +{{}} 124ed7dc87192784841839908a88b6d0623f6278408Richard Smith 125ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k1 = f(&f); // expected-error {{no match}} 126ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k2 = f(&f<int>); 127ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k3 = f(&g<int>); // expected-error {{no match}} 128ed7dc87192784841839908a88b6d0623f6278408Richard Smith 129ed7dc87192784841839908a88b6d0623f6278408Richard Smith void h() { 130ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&f; // expected-error {{address of overloaded function 'f' cannot be cast to type 'void'}} 131ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&f<int>; 132ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&g<int>; // expected-error {{address of overloaded function 'g' cannot be cast to type 'void'}} 133ed7dc87192784841839908a88b6d0623f6278408Richard Smith 134ed7dc87192784841839908a88b6d0623f6278408Richard Smith &f; // expected-error {{reference to overloaded function could not be resolved}} 135ed7dc87192784841839908a88b6d0623f6278408Richard Smith &f<int>; // expected-warning {{unused}} 136ed7dc87192784841839908a88b6d0623f6278408Richard Smith &g<int>; // expected-error {{reference to overloaded function could not be resolved}} 137ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 138ed7dc87192784841839908a88b6d0623f6278408Richard Smith 139ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct S { 140ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> static int f(T); 141ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> static int g(T); 142ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> static int g(T, int); 143ed7dc87192784841839908a88b6d0623f6278408Richard Smith } s; 144ed7dc87192784841839908a88b6d0623f6278408Richard Smith 145ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k4 = f(&s.f); // expected-error {{non-constant pointer to member}} 146ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k5 = f(&s.f<int>); 147ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k6 = f(&s.g<int>); // expected-error {{non-constant pointer to member}} 148ed7dc87192784841839908a88b6d0623f6278408Richard Smith 149ed7dc87192784841839908a88b6d0623f6278408Richard Smith void i() { 150ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.f; // expected-error {{non-constant pointer to member}} 151ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.f<int>; 152ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.g<int>; // expected-error {{non-constant pointer to member}} 153ed7dc87192784841839908a88b6d0623f6278408Richard Smith 154ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.f; // expected-error {{non-constant pointer to member}} 155ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.f<int>; // expected-warning {{unused}} 156ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.g<int>; // expected-error {{non-constant pointer to member}} 157ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 158ed7dc87192784841839908a88b6d0623f6278408Richard Smith 159ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct T { 160ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int f(T); 161ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int g(T); 162ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int g(T, int); 163ed7dc87192784841839908a88b6d0623f6278408Richard Smith } t; 164ed7dc87192784841839908a88b6d0623f6278408Richard Smith 165ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k7 = f(&s.f); // expected-error {{non-constant pointer to member}} 166ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k8 = f(&s.f<int>); 167ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k9 = f(&s.g<int>); // expected-error {{non-constant pointer to member}} 168ed7dc87192784841839908a88b6d0623f6278408Richard Smith 169ed7dc87192784841839908a88b6d0623f6278408Richard Smith void j() { 170ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.f; // expected-error {{non-constant pointer to member}} 171ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.f<int>; 172ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.g<int>; // expected-error {{non-constant pointer to member}} 173ed7dc87192784841839908a88b6d0623f6278408Richard Smith 174ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.f; // expected-error {{non-constant pointer to member}} 175ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.f<int>; // expected-warning {{unused}} 176ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.g<int>; // expected-error {{non-constant pointer to member}} 177ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 178ed7dc87192784841839908a88b6d0623f6278408Richard Smith 179ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L 180ed7dc87192784841839908a88b6d0623f6278408Richard Smith // Special case kicks in only if a template argument list is specified. 181ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T=int> void with_default(); // expected-note +{{}} 182ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k10 = f(&with_default); // expected-error {{no matching function}} 183ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k11 = f(&with_default<>); 184ed7dc87192784841839908a88b6d0623f6278408Richard Smith void k() { 185ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&with_default; // expected-error {{overloaded function}} 186ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&with_default<>; 187ed7dc87192784841839908a88b6d0623f6278408Richard Smith &with_default; // expected-error {{overloaded function}} 188ed7dc87192784841839908a88b6d0623f6278408Richard Smith &with_default<>; // expected-warning {{unused}} 189ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 190ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 191ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 192ed7dc87192784841839908a88b6d0623f6278408Richard Smith 193ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr116 { // dr116: yes 194ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<int> struct A {}; 195ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<int N> void f(A<N>) {} // expected-note {{previous}} 196ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<int M> void f(A<M>) {} // expected-error {{redefinition}} 197ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(A<sizeof(T)>) {} // expected-note {{previous}} 198ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename U> void f(A<sizeof(U)>) {} // expected-error {{redefinition}} 199ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 200ed7dc87192784841839908a88b6d0623f6278408Richard Smith 201ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr117: na 202ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr118 FIXME: add codegen test 203ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr119: na 204ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr120: na 205ed7dc87192784841839908a88b6d0623f6278408Richard Smith 206ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr121 { // dr121: yes 207ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct X { 208ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct Y {}; 209ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 210ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct Z { 211ed7dc87192784841839908a88b6d0623f6278408Richard Smith X::Y<T> x; 212ed7dc87192784841839908a88b6d0623f6278408Richard Smith T::Y<T> y; // expected-error +{{}} 213ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 214ed7dc87192784841839908a88b6d0623f6278408Richard Smith Z<X> z; 215ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 216ed7dc87192784841839908a88b6d0623f6278408Richard Smith 217ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr122 { // dr122: yes 218ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(); 219ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { f<int>(); } 220ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 221ed7dc87192784841839908a88b6d0623f6278408Richard Smith 222ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr123: na 223ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr124: dup 201 224ed7dc87192784841839908a88b6d0623f6278408Richard Smith 225ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr125: yes 226ed7dc87192784841839908a88b6d0623f6278408Richard Smithstruct dr125_A { struct dr125_B {}; }; 227ed7dc87192784841839908a88b6d0623f6278408Richard Smithdr125_A::dr125_B dr125_C(); 228ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr125_B { dr125_A dr125_C(); } 229ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr125 { 230ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct X { 231ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend dr125_A::dr125_B (::dr125_C)(); // ok 232ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend dr125_A (::dr125_B::dr125_C)(); // ok 233ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend dr125_A::dr125_B::dr125_C(); // expected-error {{requires a type specifier}} 234ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 235ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 236ed7dc87192784841839908a88b6d0623f6278408Richard Smith 237ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr126 { // dr126: no 238ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct C {}; 239ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct D : C {}; 240ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct E : private C { friend class A; friend class B; }; 241ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct F : protected C {}; 242ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct G : C {}; 243ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct H : D, G {}; 244ed7dc87192784841839908a88b6d0623f6278408Richard Smith 245ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 246ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void cp() throw(C*); 247ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void dp() throw(C*); 248ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ep() throw(C*); // expected-note {{overridden}} 249ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void fp() throw(C*); // expected-note {{overridden}} 250ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void gp() throw(C*); 251ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void hp() throw(C*); // expected-note {{overridden}} 252ed7dc87192784841839908a88b6d0623f6278408Richard Smith 253ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void cr() throw(C&); 254ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void dr() throw(C&); 255ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void er() throw(C&); // expected-note {{overridden}} 256ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void fr() throw(C&); // expected-note {{overridden}} 257ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void gr() throw(C&); 258ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void hr() throw(C&); // expected-note {{overridden}} 259ed7dc87192784841839908a88b6d0623f6278408Richard Smith 260ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void pv() throw(void*); // expected-note {{overridden}} 261ed7dc87192784841839908a88b6d0623f6278408Richard Smith 262ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L 263ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void np() throw(C*); // expected-note {{overridden}} 264ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void npm() throw(int C::*); // expected-note {{overridden}} 265ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void nr() throw(C&); // expected-note {{overridden}} 266ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 267ed7dc87192784841839908a88b6d0623f6278408Richard Smith 268ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ref1() throw(C *const&); 269ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ref2() throw(C *); 270ed7dc87192784841839908a88b6d0623f6278408Richard Smith 271ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void v() throw(int); 272ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void w() throw(const int); 273ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void x() throw(int*); 274ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void y() throw(const int*); 275ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void z() throw(int); // expected-note {{overridden}} 276ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 277ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B : A { 278ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void cp() throw(C*); 279ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void dp() throw(D*); 280ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ep() throw(E*); // expected-error {{more lax}} 281ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void fp() throw(F*); // expected-error {{more lax}} 282ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void gp() throw(G*); 283ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void hp() throw(H*); // expected-error {{more lax}} 284ed7dc87192784841839908a88b6d0623f6278408Richard Smith 285ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void cr() throw(C&); 286ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void dr() throw(D&); 287ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void er() throw(E&); // expected-error {{more lax}} 288ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void fr() throw(F&); // expected-error {{more lax}} 289ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void gr() throw(G&); 290ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void hr() throw(H&); // expected-error {{more lax}} 291ed7dc87192784841839908a88b6d0623f6278408Richard Smith 292ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void pv() throw(C*); // expected-error {{more lax}} FIXME: This is valid. 293ed7dc87192784841839908a88b6d0623f6278408Richard Smith 294ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L 295ed7dc87192784841839908a88b6d0623f6278408Richard Smith using nullptr_t = decltype(nullptr); 296ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void np() throw(nullptr_t*); // expected-error {{more lax}} FIXME: This is valid. 297ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void npm() throw(nullptr_t*); // expected-error {{more lax}} FIXME: This is valid. 298ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void nr() throw(nullptr_t&); // expected-error {{more lax}} This is not. 299ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 300ed7dc87192784841839908a88b6d0623f6278408Richard Smith 301ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ref1() throw(D *const &); 302ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ref2() throw(D *); 303ed7dc87192784841839908a88b6d0623f6278408Richard Smith 304ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void v() throw(const int); 305ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void w() throw(int); 306ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void x() throw(const int*); // FIXME: 'const int*' is not allowed by A::h. 307ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void y() throw(int*); // ok 308ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void z() throw(long); // expected-error {{more lax}} 309ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 310ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 311ed7dc87192784841839908a88b6d0623f6278408Richard Smith 312ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr127 { // dr127: yes 3135c8a92ef245c773fa56e66a8c88ae9393eea2fb6Richard Smith __extension__ typedef __decltype(sizeof(0)) size_t; 314ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct A { 315ed7dc87192784841839908a88b6d0623f6278408Richard Smith A() throw(int); 316ed7dc87192784841839908a88b6d0623f6278408Richard Smith void *operator new(size_t, const char * = 0); 317ed7dc87192784841839908a88b6d0623f6278408Richard Smith void operator delete(void *, const char *) { T::error; } // expected-error 2{{no members}} 318ed7dc87192784841839908a88b6d0623f6278408Richard Smith void operator delete(void *) { T::error; } 319ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 320ed7dc87192784841839908a88b6d0623f6278408Richard Smith A<void> *p = new A<void>; // expected-note {{instantiat}} 321ed7dc87192784841839908a88b6d0623f6278408Richard Smith A<int> *q = new ("") A<int>; // expected-note {{instantiat}} 322ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 323ed7dc87192784841839908a88b6d0623f6278408Richard Smith 324ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr128 { // dr128: yes 325ed7dc87192784841839908a88b6d0623f6278408Richard Smith enum E1 { e1 } x = e1; 326ed7dc87192784841839908a88b6d0623f6278408Richard Smith enum E2 { e2 } y = static_cast<E2>(x), z = static_cast<E2>(e1); 327ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 328ed7dc87192784841839908a88b6d0623f6278408Richard Smith 329ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr129: dup 616 330ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr130: na 331ed7dc87192784841839908a88b6d0623f6278408Richard Smith 332ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr131 { // dr131: yes 333ed7dc87192784841839908a88b6d0623f6278408Richard Smith const char *a_with_\u0e8c = "\u0e8c"; 334ed7dc87192784841839908a88b6d0623f6278408Richard Smith const char *b_with_\u0e8d = "\u0e8d"; 335ed7dc87192784841839908a88b6d0623f6278408Richard Smith const char *c_with_\u0e8e = "\u0e8e"; 336ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L 337ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-error@-4 {{expected ';'}} expected-error@-2 {{expected ';'}} 338ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 339ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 340ed7dc87192784841839908a88b6d0623f6278408Richard Smith 341ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr132 { // dr132: no 342ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f() { 343ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern struct {} x; // ok 344ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern struct S {} y; // FIXME: This is invalid. 345ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 346ed7dc87192784841839908a88b6d0623f6278408Richard Smith static enum { E } e; 347ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 348ed7dc87192784841839908a88b6d0623f6278408Richard Smith 349ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr133: dup 87 350ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr134: na 351ed7dc87192784841839908a88b6d0623f6278408Richard Smith 352ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr135 { // dr135: yes 353ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 354ed7dc87192784841839908a88b6d0623f6278408Richard Smith A f(A a) { return a; } 355ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend A g(A a) { return a; } 356ed7dc87192784841839908a88b6d0623f6278408Richard Smith static A h(A a) { return a; } 357ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 358ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 359ed7dc87192784841839908a88b6d0623f6278408Richard Smith 360ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr136 { // dr136: no 361ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f(int, int, int = 0); 362ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(int, int, int); 363ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 364ed7dc87192784841839908a88b6d0623f6278408Richard Smith // FIXME: These declarations of f, g, and h are invalid. 365ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void f(int, int = 0, int); 366ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void g(int, int, int = 0); 367ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void h(int, int, int = 0); 368ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void i(int, int, int = 0) {} 369ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void j(int, int, int = 0) {} 370ed7dc87192784841839908a88b6d0623f6278408Richard Smith operator int(); 371ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 372ed7dc87192784841839908a88b6d0623f6278408Richard Smith // FIXME: This declaration of i is invalid. 373ed7dc87192784841839908a88b6d0623f6278408Richard Smith void i(int, int, int); 374ed7dc87192784841839908a88b6d0623f6278408Richard Smith void q() { 375ed7dc87192784841839908a88b6d0623f6278408Richard Smith j(A(), A()); // ok, has default argument 376ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 377ed7dc87192784841839908a88b6d0623f6278408Richard Smith // FIXME: Also test extern "C" friends and default arguments from other 378ed7dc87192784841839908a88b6d0623f6278408Richard Smith // namespaces? 379ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 380ed7dc87192784841839908a88b6d0623f6278408Richard Smith 381ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr137 { // dr137: yes 382ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern void *p; 383ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern const void *cp; 384ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern volatile void *vp; 385ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern const volatile void *cvp; 386ed7dc87192784841839908a88b6d0623f6278408Richard Smith int *q = static_cast<int*>(p); 387ed7dc87192784841839908a88b6d0623f6278408Richard Smith int *qc = static_cast<int*>(cp); // expected-error {{casts away qualifiers}} 388ed7dc87192784841839908a88b6d0623f6278408Richard Smith int *qv = static_cast<int*>(vp); // expected-error {{casts away qualifiers}} 389ed7dc87192784841839908a88b6d0623f6278408Richard Smith int *qcv = static_cast<int*>(cvp); // expected-error {{casts away qualifiers}} 390ed7dc87192784841839908a88b6d0623f6278408Richard Smith const int *cq = static_cast<const int*>(p); 391ed7dc87192784841839908a88b6d0623f6278408Richard Smith const int *cqc = static_cast<const int*>(cp); 392ed7dc87192784841839908a88b6d0623f6278408Richard Smith const int *cqv = static_cast<const int*>(vp); // expected-error {{casts away qualifiers}} 393ed7dc87192784841839908a88b6d0623f6278408Richard Smith const int *cqcv = static_cast<const int*>(cvp); // expected-error {{casts away qualifiers}} 394ed7dc87192784841839908a88b6d0623f6278408Richard Smith const volatile int *cvq = static_cast<const volatile int*>(p); 395ed7dc87192784841839908a88b6d0623f6278408Richard Smith const volatile int *cvqc = static_cast<const volatile int*>(cp); 396ed7dc87192784841839908a88b6d0623f6278408Richard Smith const volatile int *cvqv = static_cast<const volatile int*>(vp); 397ed7dc87192784841839908a88b6d0623f6278408Richard Smith const volatile int *cvqcv = static_cast<const volatile int*>(cvp); 398ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 399ed7dc87192784841839908a88b6d0623f6278408Richard Smith 400ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr139 { // dr139: yes 401ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example1 { 402ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef int f; // expected-note {{previous}} 403ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 404ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void f(A &); // expected-error {{different kind of symbol}} 405ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 406ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 407ed7dc87192784841839908a88b6d0623f6278408Richard Smith 408ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example2 { 409ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef int f; 410ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace N { 411ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 412ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void f(A &); 413ed7dc87192784841839908a88b6d0623f6278408Richard Smith operator int(); 414ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(A a) { int i = f(a); } // ok, f is typedef not friend function 415ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 416ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 417ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 418ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 419ed7dc87192784841839908a88b6d0623f6278408Richard Smith 420ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr140 { // dr140: yes 421ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f(int *const) {} // expected-note {{previous}} 422ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f(int[3]) {} // expected-error {{redefinition}} 423ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(const int); 424ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(int n) { n = 2; } 425ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 426ed7dc87192784841839908a88b6d0623f6278408Richard Smith 427ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr141 { // dr141: yes 428ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(); 429ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct S { int n; }; 430ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A : S<int> { 431ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(); 432ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct S {}; 433ed7dc87192784841839908a88b6d0623f6278408Richard Smith } a; 434ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B : S<int> {} b; 435ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { 436ed7dc87192784841839908a88b6d0623f6278408Richard Smith a.f<int>(); 437ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)a.S<int>::n; // expected-error {{no member named 'n'}} 438ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L 439ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-error@-2 {{ambiguous}} 440ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-note@-11 {{lookup from the current scope}} 441ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-note@-9 {{lookup in the object type}} 442ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 443ed7dc87192784841839908a88b6d0623f6278408Richard Smith b.f<int>(); // expected-error {{no member}} expected-error +{{}} 444ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)b.S<int>::n; 445ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 446ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct C { 447ed7dc87192784841839908a88b6d0623f6278408Richard Smith T t; 448ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { 449ed7dc87192784841839908a88b6d0623f6278408Richard Smith t.f<int>(); // expected-error {{use 'template'}} 450ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 451ed7dc87192784841839908a88b6d0623f6278408Richard Smith void h() { 452ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)t.S<int>::n; // ok 453ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 454ed7dc87192784841839908a88b6d0623f6278408Richard Smith void i() { 455ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)t.S<int>(); // ok! 456ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 457ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 458ed7dc87192784841839908a88b6d0623f6278408Richard Smith void h() { C<B>().h(); } // ok 459ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct X { 460ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void S(); 461ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 462ed7dc87192784841839908a88b6d0623f6278408Richard Smith void i() { C<X>().i(); } // ok!! 463ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 464ed7dc87192784841839908a88b6d0623f6278408Richard Smith 465ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr142 { // dr142: yes 466ed7dc87192784841839908a88b6d0623f6278408Richard Smith class B { // expected-note +{{here}} 467ed7dc87192784841839908a88b6d0623f6278408Richard Smith public: 468ed7dc87192784841839908a88b6d0623f6278408Richard Smith int mi; // expected-note +{{here}} 469ed7dc87192784841839908a88b6d0623f6278408Richard Smith static int si; // expected-note +{{here}} 470ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 471ed7dc87192784841839908a88b6d0623f6278408Richard Smith class D : private B { // expected-note +{{here}} 472ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 473ed7dc87192784841839908a88b6d0623f6278408Richard Smith class DD : public D { 474ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f(); 475ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 476ed7dc87192784841839908a88b6d0623f6278408Richard Smith void DD::f() { 477ed7dc87192784841839908a88b6d0623f6278408Richard Smith mi = 3; // expected-error {{private base class}} expected-error {{private member}} 478ed7dc87192784841839908a88b6d0623f6278408Richard Smith si = 3; // expected-error {{private member}} 479ed7dc87192784841839908a88b6d0623f6278408Richard Smith B b_old; // expected-error {{private member}} 480ed7dc87192784841839908a88b6d0623f6278408Richard Smith dr142::B b; 481ed7dc87192784841839908a88b6d0623f6278408Richard Smith b.mi = 3; 482ed7dc87192784841839908a88b6d0623f6278408Richard Smith b.si = 3; 483ed7dc87192784841839908a88b6d0623f6278408Richard Smith B::si = 3; // expected-error {{private member}} 484ed7dc87192784841839908a88b6d0623f6278408Richard Smith dr142::B::si = 3; 485ed7dc87192784841839908a88b6d0623f6278408Richard Smith B *bp1_old = this; // expected-error {{private member}} expected-error {{private base class}} 486ed7dc87192784841839908a88b6d0623f6278408Richard Smith dr142::B *bp1 = this; // expected-error {{private base class}} 487ed7dc87192784841839908a88b6d0623f6278408Richard Smith B *bp2_old = (B*)this; // expected-error 2{{private member}} 488ed7dc87192784841839908a88b6d0623f6278408Richard Smith dr142::B *bp2 = (dr142::B*)this; 489ed7dc87192784841839908a88b6d0623f6278408Richard Smith bp2->mi = 3; 490ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 491ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 492ed7dc87192784841839908a88b6d0623f6278408Richard Smith 493ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr143 { // dr143: yes 494ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace A { struct X; } 495ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace B { void f(A::X); } 496ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace A { 497ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct X { friend void B::f(X); }; 498ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 499ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(A::X x) { 500ed7dc87192784841839908a88b6d0623f6278408Richard Smith f(x); // expected-error {{undeclared identifier 'f'}} 501ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 502ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 503ed7dc87192784841839908a88b6d0623f6278408Richard Smith 504ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr145 { // dr145: yes 505ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f(bool b) { 506ed7dc87192784841839908a88b6d0623f6278408Richard Smith ++b; // expected-warning {{deprecated}} 507ed7dc87192784841839908a88b6d0623f6278408Richard Smith b++; // expected-warning {{deprecated}} 508ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 509ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 510ed7dc87192784841839908a88b6d0623f6278408Richard Smith 511ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr147 { // dr147: no 512ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example1 { 513ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename> struct A { 514ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> A(T); 515ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 516ed7dc87192784841839908a88b6d0623f6278408Richard Smith // FIXME: This appears to be valid, and EDG and G++ accept. 517ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<> template<> A<int>::A<int>(int) {} // expected-error {{out-of-line constructor for 'A' cannot have template arguments}} 518ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 519ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example2 { 520ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { A(); }; 521ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B : A { B(); }; 522ed7dc87192784841839908a88b6d0623f6278408Richard Smith A::A a1; // expected-error {{is a constructor}} 523ed7dc87192784841839908a88b6d0623f6278408Richard Smith B::A a2; 524ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 525ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example3 { 526ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename> struct A { 527ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> A(T); 528ed7dc87192784841839908a88b6d0623f6278408Richard Smith static A a; 529ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 530ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<> A<int>::A<int>(A<int>::a); // expected-error {{is a constructor}} 531ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 532ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 533ed7dc87192784841839908a88b6d0623f6278408Richard Smith 534ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr148 { // dr148: yes 535ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { int A::*p; }; 536ed7dc87192784841839908a88b6d0623f6278408Richard Smith int check1[__is_pod(int(A::*)) ? 1 : -1]; 537ed7dc87192784841839908a88b6d0623f6278408Richard Smith int check2[__is_pod(A) ? 1 : -1]; 538ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 539ed7dc87192784841839908a88b6d0623f6278408Richard Smith 540ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr149: na 541