function-redecl.c revision 04495c859f81e440748a9b86baa2913461652bb0
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() {
4904495c859f81e440748a9b86baa2913461652bb0Douglas Gregor  extern int f2; // expected-note{{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    {
5704495c859f81e440748a9b86baa2913461652bb0Douglas Gregor      void f2(int); // okay
5804495c859f81e440748a9b86baa2913461652bb0Douglas Gregor    }
5904495c859f81e440748a9b86baa2913461652bb0Douglas Gregor  }
6004495c859f81e440748a9b86baa2913461652bb0Douglas Gregor}
61