function-redecl.c revision 6393519272ce727f4d26e71bbefb5de712274d0e
16871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor// RUN: clang -fsyntax-only -verify %s 26871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor 36871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor// PR3588 46871981fbccba9e8a63997d58245ec0add114f49Douglas Gregorvoid g0(int, int); 56871981fbccba9e8a63997d58245ec0add114f49Douglas Gregorvoid g0(); // expected-note{{previous declaration is here}} 66871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor 76871981fbccba9e8a63997d58245ec0add114f49Douglas Gregorvoid f0() { 86871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor g0(1, 2, 3); // expected-error{{too many arguments to function call}} 96871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor} 106871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor 116871981fbccba9e8a63997d58245ec0add114f49Douglas Gregorvoid g0(int); // expected-error{{conflicting types for 'g0'}} 126871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor 136871981fbccba9e8a63997d58245ec0add114f49Douglas Gregorint g1(int, int); 146871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor 156871981fbccba9e8a63997d58245ec0add114f49Douglas Gregortypedef int INT; 166871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor 176871981fbccba9e8a63997d58245ec0add114f49Douglas GregorINT g1(x, y) 186871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor int x; 196871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor int y; 206871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor{ 216871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor return x + y; 226871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor} 236871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor 246871981fbccba9e8a63997d58245ec0add114f49Douglas Gregorint g2(int, int); // expected-note{{previous declaration is here}} 256871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor 266871981fbccba9e8a63997d58245ec0add114f49Douglas GregorINT g2(x) // expected-error{{conflicting types for 'g2'}} 276871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor int x; 286871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor{ 296871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor return x; 306871981fbccba9e8a63997d58245ec0add114f49Douglas Gregor} 3104495c859f81e440748a9b86baa2913461652bb0Douglas Gregor 3204495c859f81e440748a9b86baa2913461652bb0Douglas Gregorvoid test() { 3304495c859f81e440748a9b86baa2913461652bb0Douglas Gregor int f1; 3404495c859f81e440748a9b86baa2913461652bb0Douglas Gregor { 3504495c859f81e440748a9b86baa2913461652bb0Douglas Gregor void f1(double); 3604495c859f81e440748a9b86baa2913461652bb0Douglas Gregor { 3704495c859f81e440748a9b86baa2913461652bb0Douglas Gregor void f1(double); // expected-note{{previous declaration is here}} 3804495c859f81e440748a9b86baa2913461652bb0Douglas Gregor { 3904495c859f81e440748a9b86baa2913461652bb0Douglas Gregor int f1(int); // expected-error{{conflicting types for 'f1'}} 4004495c859f81e440748a9b86baa2913461652bb0Douglas Gregor } 4104495c859f81e440748a9b86baa2913461652bb0Douglas Gregor } 4204495c859f81e440748a9b86baa2913461652bb0Douglas Gregor } 4304495c859f81e440748a9b86baa2913461652bb0Douglas Gregor} 4404495c859f81e440748a9b86baa2913461652bb0Douglas Gregor 4504495c859f81e440748a9b86baa2913461652bb0Douglas Gregorextern void g3(int); // expected-note{{previous declaration is here}} 4604495c859f81e440748a9b86baa2913461652bb0Douglas Gregorstatic void g3(int x) { } // expected-error{{static declaration of 'g3' follows non-static declaration}} 4704495c859f81e440748a9b86baa2913461652bb0Douglas Gregor 4804495c859f81e440748a9b86baa2913461652bb0Douglas Gregorvoid test2() { 49d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor extern int f2; // expected-note 2 {{previous definition is here}} 5004495c859f81e440748a9b86baa2913461652bb0Douglas Gregor { 5104495c859f81e440748a9b86baa2913461652bb0Douglas Gregor void f2(int); // expected-error{{redefinition of 'f2' as different kind of symbol}} 5204495c859f81e440748a9b86baa2913461652bb0Douglas Gregor } 5304495c859f81e440748a9b86baa2913461652bb0Douglas Gregor 5404495c859f81e440748a9b86baa2913461652bb0Douglas Gregor { 5504495c859f81e440748a9b86baa2913461652bb0Douglas Gregor int f2; 5604495c859f81e440748a9b86baa2913461652bb0Douglas Gregor { 57d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor void f2(int); // expected-error{{redefinition of 'f2' as different kind of symbol}} 5804495c859f81e440748a9b86baa2913461652bb0Douglas Gregor } 5904495c859f81e440748a9b86baa2913461652bb0Douglas Gregor } 6004495c859f81e440748a9b86baa2913461652bb0Douglas Gregor} 6125d944af5d8d665611e09956954f10896c1071f6Douglas Gregor 6225d944af5d8d665611e09956954f10896c1071f6Douglas Gregor// <rdar://problem/6127293> 6325d944af5d8d665611e09956954f10896c1071f6Douglas Gregorint outer1(int); // expected-note{{previous declaration is here}} 6425d944af5d8d665611e09956954f10896c1071f6Douglas Gregorstruct outer3 { }; 6525d944af5d8d665611e09956954f10896c1071f6Douglas Gregorint outer4(int); 6625d944af5d8d665611e09956954f10896c1071f6Douglas Gregorint outer5; // expected-note{{previous definition is here}} 6725d944af5d8d665611e09956954f10896c1071f6Douglas Gregorint *outer7(int); 6825d944af5d8d665611e09956954f10896c1071f6Douglas Gregor 6925d944af5d8d665611e09956954f10896c1071f6Douglas Gregorvoid outer_test() { 7025d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int outer1(float); // expected-error{{conflicting types for 'outer1'}} 7125d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int outer2(int); // expected-note{{previous declaration is here}} 7225d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int outer3(int); // expected-note{{previous declaration is here}} 7325d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int outer4(int); // expected-note{{previous declaration is here}} 7425d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int outer5(int); // expected-error{{redefinition of 'outer5' as different kind of symbol}} 7525d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int* outer6(int); // expected-note{{previous declaration is here}} 7625d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int *outer7(int); 776393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor int outer8(int); 7825d944af5d8d665611e09956954f10896c1071f6Douglas Gregor 7925d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int *ip7 = outer7(6); 8025d944af5d8d665611e09956954f10896c1071f6Douglas Gregor} 8125d944af5d8d665611e09956954f10896c1071f6Douglas Gregor 8225d944af5d8d665611e09956954f10896c1071f6Douglas Gregorint outer2(float); // expected-error{{conflicting types for 'outer2'}} 8325d944af5d8d665611e09956954f10896c1071f6Douglas Gregorint outer3(float); // expected-error{{conflicting types for 'outer3'}} 8425d944af5d8d665611e09956954f10896c1071f6Douglas Gregorint outer4(float); // expected-error{{conflicting types for 'outer4'}} 8525d944af5d8d665611e09956954f10896c1071f6Douglas Gregor 8625d944af5d8d665611e09956954f10896c1071f6Douglas Gregorvoid outer_test2(int x) { 8725d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int* ip = outer6(x); // expected-warning{{use of out-of-scope declaration of 'outer6'}} 8825d944af5d8d665611e09956954f10896c1071f6Douglas Gregor int *ip2 = outer7(x); 8925d944af5d8d665611e09956954f10896c1071f6Douglas Gregor} 906393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 916393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregorvoid outer_test3() { 926393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor int *(*fp)(int) = outer8; // expected-error{{use of undeclared identifier 'outer8'}} 936393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor} 946393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 956393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregorstatic float outer8(float); // okay 96