18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// The first run checks that the correct errors are generated,
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// implicitly checking the order of default argument parsing:
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// RUN: %clang_cc1 -fsyntax-only -verify %s
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// The second run checks the order of inline method definitions:
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// RUN: not %clang_cc1 -fsyntax-only %s 2> %t
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// RUN: FileCheck %s < %t
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass A {
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic:
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void a1() {
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    B b = B();
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  class B;
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void a2(B b = B()); // expected-error{{use of default argument to function 'B' that is declared later in class 'B'}}
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void a3(int a = 42);
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // CHECK: error: use of undeclared identifier 'first'
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void a4(int a = first); // expected-error{{use of undeclared identifier 'first'}}
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  class B {
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  public:
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    B(int b = 42) { // expected-note{{default argument declared here}}
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      A a;
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      a.a3();
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      a.a6();
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    void b1(A a = A()); // expected-error{{use of default argument to function 'A' that is declared later in class 'A'}}
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // CHECK: error: use of undeclared identifier 'second'
33746bde5f922dfd627d25111da4313395bc4ed6afDmitry Shmidt    void b2(int a = second); // expected-error{{use of undeclared identifier 'second'}}
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  };
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void a5() {
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    B b = B();
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void a6(B b = B());
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  A(int a = 42); // expected-note{{default argument declared here}}
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // CHECK: error: use of undeclared identifier 'third'
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  void a7(int a = third); // expected-error{{use of undeclared identifier 'third'}}
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt