Use hasCLanguageLinkage when warning about non C return types.

llvm-svn: 171263
This commit is contained in:
Rafael Espindola 2012-12-30 20:40:41 +00:00
parent 10af67a9c3
commit a5c892058c
2 changed files with 14 additions and 1 deletions

View File

@ -6266,7 +6266,7 @@ bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
// If this function is declared as being extern "C", then check to see if
// the function returns a UDT (class, struct, or union type) that is not C
// compatible, and if it does, warn the user.
if (NewFD->isExternC()) {
if (NewFD->hasCLanguageLinkage()) {
QualType R = NewFD->getResultType();
if (R->isIncompleteType() && !R->isVoidType())
Diag(NewFD->getLocation(), diag::warn_return_value_udt_incomplete)

View File

@ -38,3 +38,16 @@ extern "C" long long f11( void );
extern "C" A *f10( void );
extern "C" struct mypodstruct f12(); // expected-warning {{'f12' has C-linkage specified, but returns incomplete type 'struct mypodstruct' which could be incompatible with C}}
namespace test2 {
// FIXME: we should probably suppress the first warning as the second one
// is more precise.
// For now this tests that a second 'extern "C"' is not necessary to trigger
// the warning.
struct A;
extern "C" A f(void); // expected-warning {{'f' has C-linkage specified, but returns incomplete type 'test2::A' which could be incompatible with C}}
struct A {
A(const A&);
};
A f(void); // expected-warning {{'f' has C-linkage specified, but returns user-defined type 'test2::A' which is incompatible with C}}
}