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