1 // RUN: clang -fsyntax-only -verify %s
2 // XFAIL
3 // fails due to exact diagnostic matching
4 
5 void f(int i, int j, int k = 3);
6 void f(int i, int j, int k);
7 void f(int i, int j = 2, int k);
8 void f(int i, int j, int k);
9 void f(int i = 1, int j, int k);
10 void f(int i, int j, int k);
11 
12 void i()
13 {
14   f();
15   f(0);
16   f(0, 1);
17   f(0, 1, 2);
18 }
19 
20 
21 int f1(int i, int i, int j) { // expected-error {{redefinition of parameter 'i'}}
22   i = 17;
23   return j;
24 }
25 
26 int x;
27 void g(int x, int y = x); // expected-error {{default argument references parameter 'x'}}
28 
29 void h()
30 {
31    int i;
32    extern void h2(int x = sizeof(i)); // expected-error {{default argument references local variable 'i' of enclosing function}}
33 }
34 
35 void g2(int x, int y, int z = x + y); // expected-error {{default argument references parameter 'x'}} expected-error {{default argument references parameter 'y'}}
36 
37 void nondecl(int (*f)(int x = 5)) // {expected-error {{default arguments can only be specified}}}
38 {
39   void (*f2)(int = 17)  // {expected-error {{default arguments can only be specified}}}
40     = (void (*)(int = 42))f; // {expected-error {{default arguments can only be specified}}}
41 }
42 
43 class X {
44   void f(X* x = this); // expected-error{{invalid use of 'this' outside of a nonstatic member function}}
45 
46   void g() {
47     int f(X* x = this); // expected-error{{default argument references 'this'}}
48   }
49 };
50 
51 // C++ [dcl.fct.default]p6
52 class C {
53   static int x;
54   void f(int i = 3); // expected-note{{previous definition is here}}
55   void g(int i, int j = x);
56 
57   void h();
58 };
59 void C::f(int i = 3) // expected-error{{redefinition of default argument}}
60 { }
61 
62 void C::g(int i = 88, int j) {}
63 
64 void C::h() {
65   g(); // okay
66 }
67 
68 // C++ [dcl.fct.default]p9
69 struct Y {
70   int a;
71   int mem1(int i = a); // expected-error{{invalid use of nonstatic data member 'a'}}
72   int mem2(int i = b); // OK; use Y::b
73   int mem3(int i);
74   int mem4(int i);
75 
76   struct Nested {
77     int mem5(int i = b, // OK; use Y::b
78              int j = c, // OK; use Y::Nested::c
79              int k = j, // expected-error{{default argument references parameter 'j'}}
80              int l = a,  // expected-error{{invalid use of nonstatic data member 'a'}}
81              Nested* self = this, // expected-error{{invalid use of 'this' outside of a nonstatic member function}}
82              int m); // expected-error{{missing default argument on parameter 'm'}}
83     static int c;
84   };
85 
86   static int b;
87 
88   int (*f)(int = 17); // expected-error{{default arguments can only be specified for parameters in a function declaration}}
89 
90   void mem8(int (*fp)(int) = (int (*)(int = 17))0); // expected-error{{default arguments can only be specified for parameters in a function declaration}}
91 };
92 
93 int Y::mem3(int i = b) { return i; } // OK; use X::b
94 
95 int Y::mem4(int i = a) // expected-error{{invalid use of nonstatic data member 'a'}}
96 { return i; }
97 
98 
99 // Try to verify that default arguments interact properly with copy
100 // constructors.
101 class Z {
102 public:
103   Z(Z&, int i = 17); // expected-note{{candidate function}}
104 
105   void f(Z& z) {
106     Z z2;    // expected-error{{no matching constructor for initialization}}
107     Z z3(z);
108   }
109 
110   void test_Z(const Z& z) {
111     Z z2(z); // expected-error{{no matching constructor for initialization of 'z2'}}
112   }
113 };
114 
115 void test_Z(const Z& z) {
116   Z z2(z); // expected-error{{no matching constructor for initialization of 'z2'}}
117 }
118 
119 struct ZZ {
120   void f(ZZ z = g()); // expected-error{{no matching constructor for initialization}}
121 
122   static ZZ g(int = 17);
123 
124   ZZ(ZZ&, int = 17); // expected-note{{candidate function}}
125 };
126