1 // RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx11 -Wc++11-compat %s
2 // RUN: %clang_cc1 -fsyntax-only -verify -Wc++11-compat %s -std=c++98
5 auto int errx
; // expected-error {{storage class specified for a member declaration}}
6 #if __cplusplus <= 199711L
7 // expected-warning@-2 {{'auto' storage class specifier is redundant}}
9 // expected-warning@-4 {{'auto' storage class specifier is not permitted in C++11, and will not be supported in future releases}}
11 register int erry
; // expected-error {{storage class specified for a member declaration}}
12 extern int errz
; // expected-error {{storage class specified for a member declaration}}
16 this->x
= 0; // expected-error {{invalid use of 'this' outside of a non-static member function}}
17 x
= 0; // expected-error {{invalid use of member 'x' in static member function}}
25 x
= 0; // expected-error {{use of non-static data member 'x' of 'C' from nested type 'NestedC'}}
27 m(); // expected-error {{call to non-static member function 'm' of 'C' from nested type 'NestedC'}}
33 typedef int E
: 1; // expected-error {{typedef member 'E' cannot be a bit-field}}
34 static int sb
: 1; // expected-error {{static member 'sb' cannot be a bit-field}}
40 func btm
: 1; // expected-error {{bit-field 'btm' has non-integral type}}
41 NestedC bc
: 1; // expected-error {{bit-field 'bc' has non-integral type}}
46 #if __cplusplus <= 199711L
47 // expected-warning@-2 {{default member initializer for non-static data member is a C++11 extension}}
49 static int si
= 0; // expected-error {{non-const static data member must be initialized out of line}}
50 static const NestedC ci
= 0; // expected-error {{static data member of type 'const NestedC' must be initialized out of line}}
51 static const int nci
= vs
; // expected-error {{in-class initializer for static data member is not a constant expression}}
52 static const int vi
= 0;
53 static const volatile int cvi
= 0; // ok, illegal in C++11
54 #if __cplusplus >= 201103L
55 // expected-error@-2 {{static const volatile data member must be initialized out of line}}
57 static const E evi
= 0;
58 static const int overflow
= 1000000*1000000; // cxx11-error {{in-class initializer for static data member is not a constant expression}}
59 // expected-warning@-1 {{overflow in expression}}
60 static const int overflow_shift
= 1<<32; // cxx11-error {{in-class initializer for static data member is not a constant expression}}
61 static const int overflow_shift2
= 1>>32; // cxx11-error {{in-class initializer for static data member is not a constant expression}}
62 static const int overflow_shift3
= 1<<-1; // cxx11-error {{in-class initializer for static data member is not a constant expression}}
63 static const int overflow_shift4
= 1<<-1; // cxx11-error {{in-class initializer for static data member is not a constant expression}}
64 static const int overflow_shift5
= -1<<1; // cxx11-error {{in-class initializer for static data member is not a constant expression}}
70 this = 0; // expected-error {{expression is not assignable}}
75 return p
+ x
+ this->y
+ z
;
80 virtual int viv
; // expected-error {{'virtual' can only appear on non-static member functions}}
81 virtual static int vsif(); // expected-error {{'virtual' can only appear on non-static member functions}}
89 mutable int &mir
; // expected-error {{'mutable' cannot be applied to references}}
90 mutable void mfn(); // expected-error {{'mutable' cannot be applied to functions}}
91 mutable const int mci
; // expected-error {{'mutable' and 'const' cannot be mixed}}
93 static const int number
= 50;
94 static int arr
[number
];
101 int m() { return lx
; }
104 int m() { return lx
; }
115 const C3 c3
= { 1, 2 };
116 (void)static_cast<int*>(&c3
.i
); // expected-error {{static_cast from 'const int *' to 'int *' is not allowed}}
118 (void)static_cast<int*>(&c3
.j
);
121 // Play with mutable a bit more, to make sure it doesn't crash anything.
122 mutable int gi
; // expected-error {{'mutable' can only be applied to member variables}}
123 mutable void gfn(); // expected-error {{illegal storage class on function}}
126 mutable int ml
; // expected-error {{'mutable' can only be applied to member variables}}
128 // PR3020: This used to crash due to double ownership of C4.
130 C4
; // expected-warning {{declaration does not declare anything}}
134 void f(); // expected-note{{previous declaration is here}}
135 int f
; // expected-error{{duplicate member 'f'}}
138 // PR5415 - don't hang!
141 void f(); // expected-note 1 {{previous declaration}} expected-note {{previous declaration}}
142 void S::f() {} // expected-error {{extra qualification on member}} expected-error {{class member cannot be redeclared}}
143 void f() {} // expected-error {{class member cannot be redeclared}}
146 // Don't crash on this bogus code.
148 template<class T1
, class T2
> struct foo
:
149 bogus
<foo
<T1
,T2
> > // expected-error {{no template named 'bogus'}}
152 template<> struct foo
<unknown
,unknown
> { // expected-error {{undeclared identifier 'unknown'}}
153 template <typename U1
, typename U2
> struct bar
{
155 static const int value
= 0;
161 class EnclosingClass
{
163 struct A
{ } mutable *member
;
166 void f(const EnclosingClass
&ec
) {
177 enum { x
= sizeof(i
) };
178 enum { y
= sizeof(a
) };
183 namespace rdar8066414
{
186 } // expected-error{{expected ';' after class}}
189 namespace rdar8367341
{
191 #if __cplusplus >= 201103L
192 // expected-note@-2 {{declared here}}
196 #if __cplusplus <= 199711L
197 static const float x
= 5.0f
; // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}}
198 static const float y
= foo(); // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}} expected-error {{in-class initializer for static data member is not a constant expression}}
200 static constexpr float x
= 5.0f
;
201 static constexpr float y
= foo(); // expected-error {{constexpr variable 'y' must be initialized by a constant expression}} expected-note {{non-constexpr function 'foo' cannot be used in a constant expression}}
206 namespace with_anon
{
214 S::c
; // expected-error {{invalid use of non-static data member}}
219 static int const PR9989_Member
= sizeof PR9989_Member
;