• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
2 
3 struct one { char c[1]; };
4 struct two { char c[2]; };
5 
6 namespace aggregate {
7   // Direct list initialization does NOT allow braces to be elided!
8   struct S {
9     int ar[2];
10     struct T {
11       int i1;
12       int i2;
13     } t;
14     struct U {
15       int i1;
16     } u[2];
17     struct V {
18       int var[2];
19     } v;
20   };
21 
bracing()22   void bracing() {
23     S s1 = { 1, 2, 3 ,4, 5, 6, 7, 8 }; // no-error
24     S s2{ {1, 2}, {3, 4}, { {5}, {6} }, { {7, 8} } }; // completely braced
25     S s3{ 1, 2, 3, 4, 5, 6 }; // expected-error 5 {{cannot omit braces}}
26     S s4{ {1, 2}, {3, 4}, {5, 6}, { {7, 8} } }; // expected-error 2 {{cannot omit braces}}
27     S s5{ {1, 2}, {3, 4}, { {5}, {6} }, {7, 8} }; // expected-error {{cannot omit braces}}
28   }
29 
bracing_new()30   void bracing_new() {
31     new S{ {1, 2}, {3, 4}, { {5}, {6} }, { {7, 8} } }; // completely braced
32     new S{ 1, 2, 3, 4, 5, 6 }; // expected-error 5 {{cannot omit braces}}
33     new S{ {1, 2}, {3, 4}, {5, 6}, { {7, 8} } }; // expected-error 2 {{cannot omit braces}}
34     new S{ {1, 2}, {3, 4}, { {5}, {6} }, {7, 8} }; // expected-error {{cannot omit braces}}
35   }
36 
bracing_construct()37   void bracing_construct() {
38     (void) S{ {1, 2}, {3, 4}, { {5}, {6} }, { {7, 8} } }; // completely braced
39     (void) S{ 1, 2, 3, 4, 5, 6 }; // expected-error 5 {{cannot omit braces}}
40     (void) S{ {1, 2}, {3, 4}, {5, 6}, { {7, 8} } }; // expected-error 2 {{cannot omit braces}}
41     (void) S{ {1, 2}, {3, 4}, { {5}, {6} }, {7, 8} }; // expected-error {{cannot omit braces}}
42   }
43 
44   struct String {
45     String(const char*);
46   };
47 
48   struct A {
49     int m1;
50     int m2;
51   };
52 
function_call()53   void function_call() {
54     void takes_A(A);
55     takes_A({1, 2});
56   }
57 
58   struct B {
59     int m1;
60     String m2;
61   };
62 
overloaded_call()63   void overloaded_call() {
64     one overloaded(A);
65     two overloaded(B);
66 
67     static_assert(sizeof(overloaded({1, 2})) == sizeof(one), "bad overload");
68     static_assert(sizeof(overloaded({1, "two"})) == sizeof(two),
69       "bad overload");
70     // String is not default-constructible
71     static_assert(sizeof(overloaded({1})) == sizeof(one), "bad overload");
72   }
73 
Caggregate::C74   struct C { int a[2]; C():a({1, 2}) { } }; // expected-error {{parenthesized initialization of a member array is a GNU extension}}
75 }
76 
77 namespace array_explicit_conversion {
78   typedef int test1[2];
79   typedef int test2[];
80   template<int x> struct A { int a[x]; }; // expected-error {{'a' declared as an array with a negative size}}
81   typedef A<1> test3[];
82   typedef A<-1> test4[];
f()83   void f() {
84     (void)test1{1};
85     (void)test2{1};
86     (void)test3{{{1}}};
87     (void)test4{{{1}}}; // expected-note {{in instantiation of template class 'array_explicit_conversion::A<-1>' requested here}}
88   }
89 }
90 
91 namespace sub_constructor {
92   struct DefaultConstructor { // expected-note 2 {{not viable}}
93     DefaultConstructor(); // expected-note  {{not viable}}
94     int x;
95   };
96   struct NoDefaultConstructor1 { // expected-note 2 {{not viable}}
97     NoDefaultConstructor1(int); // expected-note {{not viable}}
98     int x;
99   };
100   struct NoDefaultConstructor2 {  // expected-note 4 {{not viable}}
101     NoDefaultConstructor2(int,int); // expected-note 2 {{not viable}}
102     int x;
103   };
104 
105   struct Aggr {
106     DefaultConstructor a;
107     NoDefaultConstructor1 b;
108     NoDefaultConstructor2 c;
109   };
110 
111   Aggr ok1 { {}, {0} , {0,0} };
112   Aggr ok2 = { {}, {0} , {0,0} };
113   Aggr too_many { {0} , {0} , {0,0} }; // expected-error {{no matching constructor for initialization}}
114   Aggr too_few { {} , {0} , {0} }; // expected-error {{no matching constructor for initialization}}
115   Aggr invalid { {} , {&ok1} , {0,0} }; // expected-error {{no matching constructor for initialization}}
116   NoDefaultConstructor2 array_ok[] = { {0,0} , {0,1} };
117   NoDefaultConstructor2 array_error[] = { {0,0} , {0} }; // expected-error {{no matching constructor for initialization}}
118 }