xref: /aosp_15_r20/external/clang/test/SemaCXX/default1.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4*67e74705SXin Li 
5*67e74705SXin Li void f(int i);
6*67e74705SXin Li void f(int i = 0); // expected-note {{previous definition is here}}
7*67e74705SXin Li void f(int i = 17); // expected-error {{redefinition of default argument}}
8*67e74705SXin Li 
9*67e74705SXin Li 
10*67e74705SXin Li void g(int i, int j, int k = 3);
11*67e74705SXin Li void g(int i, int j = 2, int k);
12*67e74705SXin Li void g(int i = 1, int j, int k);
13*67e74705SXin Li 
14*67e74705SXin Li void h(int i, int j = 2, int k = 3,
15*67e74705SXin Li        int l, // expected-error {{missing default argument on parameter 'l'}}
16*67e74705SXin Li        int,   // expected-error {{missing default argument on parameter}}
17*67e74705SXin Li        int n);// expected-error {{missing default argument on parameter 'n'}}
18*67e74705SXin Li 
19*67e74705SXin Li struct S { } s;
i(int=s)20*67e74705SXin Li void i(int = s) { } // expected-error {{no viable conversion}} \
21*67e74705SXin Li // expected-note{{passing argument to parameter here}}
22*67e74705SXin Li 
23*67e74705SXin Li struct X {
24*67e74705SXin Li   X(int);
25*67e74705SXin Li };
26*67e74705SXin Li 
27*67e74705SXin Li void j(X x = 17); // expected-note{{'::j' declared here}}
28*67e74705SXin Li 
29*67e74705SXin Li struct Y { // expected-note 2{{candidate constructor (the implicit copy constructor) not viable}}
30*67e74705SXin Li #if __cplusplus >= 201103L // C++11 or later
31*67e74705SXin Li // expected-note@-2 2 {{candidate constructor (the implicit move constructor) not viable}}
32*67e74705SXin Li #endif
33*67e74705SXin Li 
34*67e74705SXin Li   explicit Y(int);
35*67e74705SXin Li };
36*67e74705SXin Li 
37*67e74705SXin Li void k(Y y = 17); // expected-error{{no viable conversion}} \
38*67e74705SXin Li // expected-note{{passing argument to parameter 'y' here}}
39*67e74705SXin Li 
40*67e74705SXin Li void kk(Y = 17); // expected-error{{no viable conversion}} \
41*67e74705SXin Li // expected-note{{passing argument to parameter here}}
42*67e74705SXin Li 
l()43*67e74705SXin Li int l () {
44*67e74705SXin Li   int m(int i, int j, int k = 3);
45*67e74705SXin Li   if (1)
46*67e74705SXin Li   {
47*67e74705SXin Li     int m(int i, int j = 2, int k = 4);
48*67e74705SXin Li     m(8);
49*67e74705SXin Li   }
50*67e74705SXin Li   return 0;
51*67e74705SXin Li }
52*67e74705SXin Li 
i()53*67e74705SXin Li int i () {
54*67e74705SXin Li   void j (int f = 4);
55*67e74705SXin Li   {
56*67e74705SXin Li     void j (int f);
57*67e74705SXin Li     j(); // expected-error{{too few arguments to function call, expected 1, have 0; did you mean '::j'?}}
58*67e74705SXin Li   }
59*67e74705SXin Li   void jj (int f = 4);
60*67e74705SXin Li   {
61*67e74705SXin Li     void jj (int f); // expected-note{{'jj' declared here}}
62*67e74705SXin Li     jj(); // expected-error{{too few arguments to function call, single argument 'f' was not specified}}
63*67e74705SXin Li   }
64*67e74705SXin Li }
65*67e74705SXin Li 
i2()66*67e74705SXin Li int i2() {
67*67e74705SXin Li   void j(int f = 4); // expected-note{{'j' declared here}}
68*67e74705SXin Li   {
69*67e74705SXin Li     j(2, 3); // expected-error{{too many arguments to function call, expected at most single argument 'f', have 2}}
70*67e74705SXin Li   }
71*67e74705SXin Li }
72*67e74705SXin Li 
73*67e74705SXin Li int pr20055_f(int x = 0, int y = UNDEFINED); // expected-error{{use of undeclared identifier}}
74*67e74705SXin Li int pr20055_v = pr20055_f(0);
75*67e74705SXin Li 
PR20769()76*67e74705SXin Li void PR20769() { void PR20769(int = 1); }
77*67e74705SXin Li void PR20769(int = 2);
78*67e74705SXin Li 
79*67e74705SXin Li void PR20769_b(int = 1);
PR20769_b()80*67e74705SXin Li void PR20769_b() { void PR20769_b(int = 2); }
81