1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | void f(int i, int j, int k = 3); |
4 | void f(int i, int j, int k); |
5 | void f(int i, int j = 2, int k); |
6 | void f(int i, int j, int k); |
7 | void f(int i = 1, int j, int k); |
8 | void f(int i, int j, int k); |
9 | |
10 | void i() |
11 | { |
12 | f(); |
13 | f(0); |
14 | f(0, 1); |
15 | f(0, 1, 2); |
16 | } |
17 | |
18 | |
19 | int f1(int i, // expected-note {{previous declaration is here}} |
20 | int i, int j) { // expected-error {{redefinition of parameter 'i'}} |
21 | i = 17; |
22 | return j; |
23 | } |
24 | |
25 | int x; |
26 | void g(int x, int y = x); // expected-error {{default argument references parameter 'x'}} |
27 | |
28 | void g2(int x, int y, int z = x + y); // expected-error {{default argument references parameter 'x'}} expected-error {{default argument references parameter 'y'}} |
29 | |
30 | class X { |
31 | void f(X* x = this); // expected-error{{invalid use of 'this' outside of a non-static member function}} |
32 | |
33 | void g() { |
34 | int f(X* x = this); // expected-error{{default argument references 'this'}} |
35 | } |
36 | }; |
37 | |
38 | // C++ [dcl.fct.default]p6 |
39 | class C { |
40 | static int x; |
41 | void f(int i = 3); // expected-note{{previous definition is here}} |
42 | void g(int i, int j = x); |
43 | |
44 | void h(); |
45 | }; |
46 | void C::f(int i = 3) // expected-error{{redefinition of default argument}} |
47 | { } |
48 | |
49 | void C::g(int i = 88, int j) {} |
50 | |
51 | void C::h() { |
52 | g(); // okay |
53 | } |
54 | |
55 | // C++ [dcl.fct.default]p9 |
56 | struct Y { |
57 | int a; |
58 | int mem1(int i = a); // expected-error{{invalid use of non-static data member 'a'}} |
59 | int mem2(int i = b); // OK; use Y::b |
60 | int mem3(int i); |
61 | int mem4(int i); |
62 | |
63 | struct Nested { |
64 | int mem5(int i = b, // OK; use Y::b |
65 | int j = c, // OK; use Y::Nested::c |
66 | int k = j, // expected-error{{default argument references parameter 'j'}} |
67 | int l = a, // expected-error{{invalid use of non-static data member 'a'}} |
68 | Nested* self = this, // expected-error{{invalid use of 'this' outside of a non-static member function}} |
69 | int m); // expected-error{{missing default argument on parameter 'm'}} |
70 | static int c; |
71 | Nested(int i = 42); |
72 | }; |
73 | |
74 | int mem7(Nested n = Nested()); |
75 | |
76 | static int b; |
77 | }; |
78 | |
79 | int Y::mem3(int i = b) { return i; } // OK; use X::b |
80 | |
81 | int Y::mem4(int i = a) // expected-error{{invalid use of non-static data member 'a'}} |
82 | { return i; } |
83 | |
84 | |
85 | // Try to verify that default arguments interact properly with copy |
86 | // constructors. |
87 | class Z { |
88 | public: |
89 | Z(Z&, int i = 17); // expected-note 3 {{candidate constructor}} |
90 | |
91 | void f(Z& z) { |
92 | Z z2; // expected-error{{no matching constructor for initialization}} |
93 | Z z3(z); |
94 | } |
95 | |
96 | void test_Z(const Z& z) { |
97 | Z z2(z); // expected-error{{no matching constructor for initialization of 'Z'}} |
98 | } |
99 | }; |
100 | |
101 | void test_Z(const Z& z) { |
102 | Z z2(z); // expected-error{{no matching constructor for initialization of 'Z'}} |
103 | } |
104 | |
105 | struct ZZ { |
106 | static ZZ g(int = 17); |
107 | |
108 | void f(ZZ z = g()); // expected-error{{no matching constructor for initialization}} \ |
109 | // expected-note{{passing argument to parameter 'z' here}} |
110 | |
111 | ZZ(ZZ&, int = 17); // expected-note{{candidate constructor}} |
112 | }; |
113 | |
114 | // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#325 |
115 | class C2 { |
116 | static void g(int = f()); // expected-error{{use of default argument to function 'f' that is declared later in class 'C2'}} |
117 | static int f(int = 10); // expected-note{{default argument declared here}} |
118 | }; |
119 | |
120 | // Make sure we actually parse the default argument for an inline definition |
121 | class XX { |
122 | void A(int length = -1 ) { } |
123 | void B() { A(); } |
124 | }; |
125 | |
126 | template <int I = (1 * I)> struct S {}; // expected-error-re {{use of undeclared identifier 'I'{{$}}}} |
127 | S<1> s; |
128 | |
129 | template <int I1 = I2, int I2 = 1> struct T {}; // expected-error-re {{use of undeclared identifier 'I2'{{$}}}} |
130 | T<0, 1> t; |
131 | |
132 | struct PR28105 { |
133 | PR28105 (int = 0, int = 0, PR28105 = 0); // expected-error{{recursive evaluation of default argument}} |
134 | }; |
135 | |