1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3void f0(int i, int j, int k = 3);
4void f0(int i, int j, int k);
5void f0(int i, int j = 2, int k);
6void f0(int i, int j, int k);
7void f0(int i = 1, // expected-note{{previous definition}}
8        int j, int k);
9void f0(int i, int j, int k);
10
11namespace N0 {
12  void f0(int, int, int); // expected-note{{candidate}}
13
14  void test_f0_inner_scope() {
15    f0(); // expected-error{{no matching}}
16  }
17}
18
19void test_f0_outer_scope() {
20  f0(); // okay
21}
22
23void f0(int i = 1, // expected-error{{redefinition of default argument}}
24        int, int);
25
26template<typename T> void f1(T); // expected-note{{previous}}
27
28template<typename T>
29void f1(T = T()); // expected-error{{cannot be added}}
30
31
32namespace N1 {
33  // example from C++03 standard
34  // FIXME: make these "f2"s into "f"s, then fix our scoping issues
35  void f2(int, int);
36  void f2(int, int = 7);
37  void h() {
38    f2(3); // OK, calls f(3, 7)
39    void f(int = 1, int);	// expected-error{{missing default argument}}
40  }
41
42  void m()
43  {
44    void f(int, int); // expected-note{{'f' declared here}}
45    f(4);  // expected-error{{too few arguments to function call}}
46    void f(int, int = 5); // expected-note{{previous definition}}
47    f(4); // okay
48    void f(int, int = 5); // expected-error{{redefinition of default argument}}
49  }
50
51  void n()
52  {
53    f2(6); // okay
54  }
55}
56