12c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman// RUN: %clang_cc1 -Wreturn-type -fsyntax-only -std=c++11 -verify %s
22c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman
32c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanclass A {
42c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanpublic:
52c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman  A(const A&);
62c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman};
72c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman
82c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanstruct S {
92c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman  int i;
102c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman  double d;
112c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman
122c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman  virtual void B() {}
132c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman};
142c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman
152c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanunion U {
162c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman  struct {
172c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman    int i;
182c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman    virtual void B() {} // Can only do this in C++11
192c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman  } t;
202c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman};
212c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman
222c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanstruct S2 {
232c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman  int i;
242c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman  double d;
252c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman};
262c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman
272c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" U f3( void ); // expected-warning {{'f3' has C-linkage specified, but returns user-defined type 'U' which is incompatible with C}}
282c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" S f0(void); // expected-warning {{'f0' has C-linkage specified, but returns user-defined type 'S' which is incompatible with C}}
292c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" A f4( void ); // expected-warning {{'f4' has C-linkage specified, but returns user-defined type 'A' which is incompatible with C}}
302c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman
312c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballman// These should all be fine
322c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" S2 f5( void );
332c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" void f2( A x );
342c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" void f6( S s );
352c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" void f7( U u );
362c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" double f8(void);
372c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" long long f11( void );
382c0bf2437089f9a297cf18530361a185e76f2150Aaron Ballmanextern "C" A *f10( void );
39