29 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			29 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -fsyntax-only -verify %s
 | 
						|
 | 
						|
// FIXME: Very incomplete!
 | 
						|
 | 
						|
// If a program calls for the default initialization of an object of a
 | 
						|
// const-qualified type T, T shall be a class type with a
 | 
						|
// user-provided default constructor, except if T has no uninitialized fields.
 | 
						|
struct MakeNonPOD { MakeNonPOD(); };
 | 
						|
struct NoUserDefault : public MakeNonPOD { int field; };
 | 
						|
struct HasUserDefault { HasUserDefault(); };
 | 
						|
 | 
						|
void test_const_default_init() {
 | 
						|
  const NoUserDefault x1; // expected-error{{default initialization of an object of const type 'const NoUserDefault' without a user-provided default constructor}}
 | 
						|
  const HasUserDefault x2;
 | 
						|
  const int x3; // expected-error{{default initialization of an object of const type 'const int'}}
 | 
						|
}
 | 
						|
 | 
						|
// rdar://8501008
 | 
						|
struct s0 { int field; };
 | 
						|
struct s1 { static const s0 foo; };
 | 
						|
const struct s0 s1::foo; // expected-error{{default initialization of an object of const type 'const struct s0' without a user-provided default constructor}}
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct s2 {
 | 
						|
  static const s0 foo;
 | 
						|
};
 | 
						|
 | 
						|
template<> const struct s0 s2<int>::foo; // okay
 |