1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 264bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor 310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl// Verify that using an initializer list for a non-aggregate looks for 410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl// constructors.. 5017ab77655b262311a3550342ca19b85380f8f20Richard Smith// Note that due to a (likely) standard bug, this is technically an aggregate, 6017ab77655b262311a3550342ca19b85380f8f20Richard Smith// but we do not treat it as one. 710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstruct NonAggr1 { // expected-note 2 {{candidate constructor}} 810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl NonAggr1(int, int) { } // expected-note {{candidate constructor}} 964bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor 1064bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor int m; 1164bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor}; 1264bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor 1364bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregorstruct Base { }; 1410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstruct NonAggr2 : public Base { // expected-note 3 {{candidate constructor}} 1564bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor int m; 1664bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor}; 1764bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor 1810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlclass NonAggr3 { // expected-note 3 {{candidate constructor}} 1964bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor int m; 2064bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor}; 2164bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor 2210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstruct NonAggr4 { // expected-note 3 {{candidate constructor}} 23d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl int m; 24d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl virtual void f(); 2564bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor}; 2664bffa9a6f40e5a3d5556f994f09f7bf45eecd4cDouglas Gregor 2710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian RedlNonAggr1 na1 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr1'}} 2810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian RedlNonAggr2 na2 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr2'}} 2910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian RedlNonAggr3 na3 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr3'}} 3010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian RedlNonAggr4 na4 = { 17 }; // expected-error{{no matching constructor for initialization of 'NonAggr4'}} 31bab497b9f94cd1538c6b3348c2331daf27dd092eDouglas Gregor 32bab497b9f94cd1538c6b3348c2331daf27dd092eDouglas Gregor// PR5817 33bab497b9f94cd1538c6b3348c2331daf27dd092eDouglas Gregortypedef int type[][2]; 34bab497b9f94cd1538c6b3348c2331daf27dd092eDouglas Gregorconst type foo = {0}; 3546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson 3646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson// Vector initialization. 3746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlssontypedef short __v4hi __attribute__ ((__vector_size__ (8))); 3846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson__v4hi v1 = { (void *)1, 2, 3 }; // expected-error {{cannot initialize a vector element of type 'short' with an rvalue of type 'void *'}} 39784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson 40784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson// Array initialization. 41784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlssonint a[] = { (void *)1 }; // expected-error {{cannot initialize an array element of type 'int' with an rvalue of type 'void *'}} 422bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson 432bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson// Struct initialization. 442bbae5de98f486d03e10c039668182075b5569ddAnders Carlssonstruct S { int a; } s = { (void *)1 }; // expected-error {{cannot initialize a member subobject of type 'int' with an rvalue of type 'void *'}} 451b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 461b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson// Check that we're copy-initializing the structs. 471b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlssonstruct A { 481b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson A(); 491b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson A(int); 501b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson ~A(); 5112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 5212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola A(const A&) = delete; // expected-note 2 {{function has been explicitly marked deleted here}} 531b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson}; 541b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 551b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlssonstruct B { 561b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson A a; 571b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson}; 581b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 591b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlssonstruct C { 601b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson const A& a; 611b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson}; 621b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 631b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlssonvoid f() { 641b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson A as1[1] = { }; 6512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola A as2[1] = { 1 }; // expected-error {{copying array element of type 'A' invokes deleted constructor}} 661b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 671b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson B b1 = { }; 6812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola B b2 = { 1 }; // expected-error {{copying member subobject of type 'A' invokes deleted constructor}} 691b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 701b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson C c1 = { 1 }; 711b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson} 72fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor 73fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregorclass Agg { 74fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregorpublic: 75fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor int i, j; 76fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor}; 77fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor 78fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregorclass AggAgg { 79fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregorpublic: 80fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor Agg agg1; 81fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor Agg agg2; 82fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor}; 83fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor 84fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas GregorAggAgg aggagg = { 1, 2, 3, 4 }; 85