1 // RUN: %clang_cc1 -fsyntax-only -std=c++98 -verify %s 2 // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s 3 // RUN: not %clang_cc1 -fsyntax-only -std=c++98 -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck --check-prefix=CXX98 %s 4 // RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck --check-prefix=CXX11 %s 5 // C++0x N2914. 6 7 struct X { 8 int i; 9 static int a; 10 }; 11 12 using X::i; // expected-error{{using declaration cannot refer to class member}} 13 using X::s; // expected-error{{using declaration cannot refer to class member}} 14 15 void f() { 16 using X::i; // expected-error{{using declaration cannot refer to class member}} 17 using X::s; // expected-error{{using declaration cannot refer to class member}} 18 } 19 20 struct S { 21 static int n; 22 struct Q {}; 23 enum E {}; 24 typedef Q T; 25 void f(); 26 static void g(); 27 }; 28 29 using S::n; // expected-error{{class member}} expected-note {{use a reference instead}} 30 #if __cplusplus < 201103L 31 // CXX98-NOT: fix-it:"{{.*}}":{[[@LINE-2]] 32 #else 33 // CXX11: fix-it:"{{.*}}":{[[@LINE-4]]:1-[[@LINE-4]]:6}:"auto &n = " 34 #endif 35 36 using S::Q; // expected-error{{class member}} 37 #if __cplusplus < 201103L 38 // expected-note@-2 {{use a typedef declaration instead}} 39 // CXX98: fix-it:"{{.*}}":{[[@LINE-3]]:1-[[@LINE-3]]:6}:"typedef" 40 // CXX98: fix-it:"{{.*}}":{[[@LINE-4]]:11-[[@LINE-4]]:11}:" Q" 41 #else 42 // expected-note@-6 {{use an alias declaration instead}} 43 // CXX11: fix-it:"{{.*}}":{[[@LINE-7]]:7-[[@LINE-7]]:7}:"Q = " 44 #endif 45 46 using S::E; // expected-error{{class member}} 47 #if __cplusplus < 201103L 48 // expected-note@-2 {{use a typedef declaration instead}} 49 // CXX98: fix-it:"{{.*}}":{[[@LINE-3]]:1-[[@LINE-3]]:6}:"typedef" 50 // CXX98: fix-it:"{{.*}}":{[[@LINE-4]]:11-[[@LINE-4]]:11}:" E" 51 #else 52 // expected-note@-6 {{use an alias declaration instead}} 53 // CXX11: fix-it:"{{.*}}":{[[@LINE-7]]:7-[[@LINE-7]]:7}:"E = " 54 #endif 55 56 using S::T; // expected-error{{class member}} 57 #if __cplusplus < 201103L 58 // expected-note@-2 {{use a typedef declaration instead}} 59 // CXX98: fix-it:"{{.*}}":{[[@LINE-3]]:1-[[@LINE-3]]:6}:"typedef" 60 // CXX98: fix-it:"{{.*}}":{[[@LINE-4]]:11-[[@LINE-4]]:11}:" T" 61 #else 62 // expected-note@-6 {{use an alias declaration instead}} 63 // CXX11: fix-it:"{{.*}}":{[[@LINE-7]]:7-[[@LINE-7]]:7}:"T = " 64 #endif 65 66 using S::f; // expected-error{{class member}} 67 using S::g; // expected-error{{class member}} 68 69 void h() { 70 using S::n; // expected-error{{class member}} expected-note {{use a reference instead}} 71 #if __cplusplus < 201103L 72 // CXX98-NOT: fix-it:"{{.*}}":{[[@LINE-2]] 73 #else 74 // CXX11: fix-it:"{{.*}}":{[[@LINE-4]]:3-[[@LINE-4]]:8}:"auto &n = " 75 #endif 76 77 using S::Q; // expected-error{{class member}} 78 #if __cplusplus < 201103L 79 // expected-note@-2 {{use a typedef declaration instead}} 80 // CXX98: fix-it:"{{.*}}":{[[@LINE-3]]:3-[[@LINE-3]]:8}:"typedef" 81 // CXX98: fix-it:"{{.*}}":{[[@LINE-4]]:13-[[@LINE-4]]:13}:" Q" 82 #else 83 // expected-note@-6 {{use an alias declaration instead}} 84 // CXX11: fix-it:"{{.*}}":{[[@LINE-7]]:9-[[@LINE-7]]:9}:"Q = " 85 #endif 86 87 using S::E; // expected-error{{class member}} 88 #if __cplusplus < 201103L 89 // expected-note@-2 {{use a typedef declaration instead}} 90 // CXX98: fix-it:"{{.*}}":{[[@LINE-3]]:3-[[@LINE-3]]:8}:"typedef" 91 // CXX98: fix-it:"{{.*}}":{[[@LINE-4]]:13-[[@LINE-4]]:13}:" E" 92 #else 93 // expected-note@-6 {{use an alias declaration instead}} 94 // CXX11: fix-it:"{{.*}}":{[[@LINE-7]]:9-[[@LINE-7]]:9}:"E = " 95 #endif 96 97 using S::T; // expected-error{{class member}} 98 #if __cplusplus < 201103L 99 // expected-note@-2 {{use a typedef declaration instead}} 100 // CXX98: fix-it:"{{.*}}":{[[@LINE-3]]:3-[[@LINE-3]]:8}:"typedef" 101 // CXX98: fix-it:"{{.*}}":{[[@LINE-4]]:13-[[@LINE-4]]:13}:" T" 102 #else 103 // expected-note@-6 {{use an alias declaration instead}} 104 // CXX11: fix-it:"{{.*}}":{[[@LINE-7]]:9-[[@LINE-7]]:9}:"T = " 105 #endif 106 107 using S::f; // expected-error{{class member}} 108 using S::g; // expected-error{{class member}} 109 } 110