blob: 863ac0e25fd0a3f89bdeb36f0f1a3347ae9bc161 [file] [log] [blame]
Chris Lattner04421082008-04-08 04:40:51 +00001// RUN: clang -fsyntax-only -verify %s
2void f(int i, int j, int k = 3);
Douglas Gregor6d6eb572008-05-07 04:49:29 +00003void f(int i, int j, int k);
Chris Lattner04421082008-04-08 04:40:51 +00004void f(int i, int j = 2, int k);
Douglas Gregor6d6eb572008-05-07 04:49:29 +00005void f(int i, int j, int k);
Chris Lattner04421082008-04-08 04:40:51 +00006void f(int i = 1, int j, int k);
Douglas Gregor6d6eb572008-05-07 04:49:29 +00007void f(int i, int j, int k);
Chris Lattner04421082008-04-08 04:40:51 +00008
9void i()
10{
11 f();
12 f(0);
13 f(0, 1);
14 f(0, 1, 2);
15}
Chris Lattner8123a952008-04-10 02:22:51 +000016
17
18int f1(int i, int i, int j) { // expected-error {{redefinition of parameter 'i'}}
19 i = 17;
20 return j;
21}
22
23int x;
24void g(int x, int y = x); // expected-error {{default argument references parameter 'x'}}
25
26void h()
27{
28 int i;
29 extern void h2(int x = sizeof(i)); // expected-error {{default argument references local variable 'i' of enclosing function}}
30}
Chris Lattner9e979552008-04-12 23:52:44 +000031
32void g2(int x, int y, int z = x + y); // expected-error {{default argument references parameter 'x'}} expected-error {{default argument references parameter 'y'}}
Douglas Gregor6d6eb572008-05-07 04:49:29 +000033
34void nondecl(int (*f)(int x = 5)) // {expected-error {{default arguments can only be specified}}}
35{
36 void (*f2)(int = 17) // {expected-error {{default arguments can only be specified}}}
37 = (void (*)(int = 42))f; // {expected-error {{default arguments can only be specified}}}
38}
Douglas Gregor30c54362008-11-03 22:47:57 +000039
40class X {
41 void f(X* x = this); // expected-error{{invalid use of 'this' outside of a nonstatic member function}}
Douglas Gregor3996f232008-11-04 13:41:56 +000042
43 void g() {
44 int f(X* x = this); // expected-error{{default argument references 'this'}}
45 }
Douglas Gregor30c54362008-11-03 22:47:57 +000046};
Douglas Gregor69497c32008-12-16 00:08:34 +000047
48// C++ [dcl.fct.default]p6
49class C {
50 static int x;
51 void f(int i = 3); // expected-note{{previous definition is here}}
52 void g(int i, int j = x);
53
54 void h();
55};
56void C::f(int i = 3) // expected-error{{redefinition of default argument}}
57{ }
58
59void C::g(int i = 88, int j) {}
60
61void C::h() {
62 g(); // okay
63}
64
65// C++ [dcl.fct.default]p9
Douglas Gregor72b505b2008-12-16 21:30:33 +000066struct Y {
Douglas Gregor69497c32008-12-16 00:08:34 +000067 int a;
68 int mem1(int i = a); // expected-error{{invalid use of nonstatic data member 'a'}}
Douglas Gregor72b505b2008-12-16 21:30:33 +000069 int mem2(int i = b); // OK; use Y::b
Douglas Gregor0a59acb2008-12-16 00:38:16 +000070 int mem3(int i);
71 int mem4(int i);
Douglas Gregor72b505b2008-12-16 21:30:33 +000072
73 struct Nested {
74 int mem5(int i = b, // OK; use Y::b
75 int j = c, // OK; use Y::Nested::c
76 int k = j, // expected-error{{default argument references parameter 'j'}}
77 int l = a, // expected-error{{invalid use of nonstatic data member 'a'}}
78 Nested* self = this, // expected-error{{invalid use of 'this' outside of a nonstatic member function}}
79 int m); // expected-error{{missing default argument on parameter 'm'}}
80 static int c;
81 };
82
Douglas Gregor69497c32008-12-16 00:08:34 +000083 static int b;
Douglas Gregor72b505b2008-12-16 21:30:33 +000084
85 int (*f)(int = 17); // expected-error{{default arguments can only be specified for parameters in a function declaration}}
86
87 void mem8(int (*fp)(int) = (int (*)(int = 17))0); // expected-error{{default arguments can only be specified for parameters in a function declaration}}
Douglas Gregor69497c32008-12-16 00:08:34 +000088};
Douglas Gregor0a59acb2008-12-16 00:38:16 +000089
90int Y::mem3(int i = b) { return i; } // OK; use X::b
91
92int Y::mem4(int i = a) // expected-error{{invalid use of nonstatic data member 'a'}}
93{ return i; }
Douglas Gregor72b505b2008-12-16 21:30:33 +000094
95
96// Try to verify that default arguments interact properly with copy
97// constructors.
98class Z {
99public:
100 Z(Z&, int i = 17); // expected-note{{candidate function}}
101
102 void f(Z& z) {
103 Z z2; // expected-error{{no matching constructor for initialization}}
104 Z z3(z);
105 }
106};
107
108void test_Z(const Z& z) {
109 Z z2(z); // expected-error{{no matching constructor for initialization of 'z2'}}
110}