xref: /aosp_15_r20/external/clang/test/SemaCXX/cxx0x-delegating-ctors.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li struct foo {
4*67e74705SXin Li   int i;
5*67e74705SXin Li   foo();
6*67e74705SXin Li   foo(int);
7*67e74705SXin Li   foo(int, int);
8*67e74705SXin Li   foo(bool);
9*67e74705SXin Li   foo(char);
10*67e74705SXin Li   foo(const float*);
11*67e74705SXin Li   foo(const float&);
12*67e74705SXin Li   foo(void*);
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li // Good
foo(int i)16*67e74705SXin Li foo::foo (int i) : i(i) {
17*67e74705SXin Li }
18*67e74705SXin Li // Good
foo()19*67e74705SXin Li foo::foo () : foo(-1) {
20*67e74705SXin Li }
21*67e74705SXin Li // Good
foo(int,int)22*67e74705SXin Li foo::foo (int, int) : foo() {
23*67e74705SXin Li }
24*67e74705SXin Li 
foo(bool)25*67e74705SXin Li foo::foo (bool) : foo(true) { // expected-error{{creates a delegation cycle}}
26*67e74705SXin Li }
27*67e74705SXin Li 
28*67e74705SXin Li // Good
foo(const float * f)29*67e74705SXin Li foo::foo (const float* f) : foo(*f) { // expected-note{{it delegates to}}
30*67e74705SXin Li }
31*67e74705SXin Li 
foo(const float & f)32*67e74705SXin Li foo::foo (const float &f) : foo(&f) { //expected-error{{creates a delegation cycle}} \
33*67e74705SXin Li                                       //expected-note{{which delegates to}}
34*67e74705SXin Li }
35*67e74705SXin Li 
foo(char)36*67e74705SXin Li foo::foo (char) :
37*67e74705SXin Li   i(3),
38*67e74705SXin Li   foo(3) { // expected-error{{must appear alone}}
39*67e74705SXin Li }
40*67e74705SXin Li 
41*67e74705SXin Li // This should not cause an infinite loop
foo(void *)42*67e74705SXin Li foo::foo (void*) : foo(4.0f) {
43*67e74705SXin Li }
44*67e74705SXin Li 
45*67e74705SXin Li struct deleted_dtor {
46*67e74705SXin Li   ~deleted_dtor() = delete; // expected-note{{'~deleted_dtor' has been explicitly marked deleted here}}
47*67e74705SXin Li   deleted_dtor();
deleted_dtordeleted_dtor48*67e74705SXin Li   deleted_dtor(int) : deleted_dtor() // expected-error{{attempt to use a deleted function}}
49*67e74705SXin Li   {}
50*67e74705SXin Li };
51