blob: 6a8bcb121c1ee257ec3e916135e63e781ca18bb6 [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
66class Y {
67 int a;
68 int mem1(int i = a); // expected-error{{invalid use of nonstatic data member 'a'}}
69 // FIXME: The code below is well-formed.
70 // int mem2(int i = b); // OK; use X::b
71 static int b;
72};