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