<div class="gmail_quote">On Thu, Feb 9, 2012 at 12:42 PM, Matt Beaumont-Gay <span dir="ltr"><<a href="mailto:matthewbg@google.com">matthewbg@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On a different note, what do you think about not warning when the<br>
return type is incomplete? It's a little surprising that we warn on<br>
this:<br>
<br>
struct foo;<br>
extern "C" { struct foo get_foo(void); }<br>
struct foo { };<br></blockquote><div><br></div><div>I think that's a bug. Incomplete struct types are relatively common as "opaque" return types.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im HOEnZb"><br>
On Wed, Feb 8, 2012 at 17:21, Aaron Ballman <<a href="mailto:aaron@aaronballman.com">aaron@aaronballman.com</a>> wrote:<br>
</div><div class="HOEnZb"><div class="h5">> Author: aaronballman<br>
> Date: Wed Feb  8 19:21:34 2012<br>
> New Revision: 150128<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=150128&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=150128&view=rev</a><br>
> Log:<br>
> Adding support for warning when a non-C compatible user-defined type is returned from an extern "C" function.<br>
><br>
> Fixes bug 6143<br>
><br>
> Added:<br>
>    cfe/trunk/test/SemaCXX/function-extern-c.cpp   (with props)<br>
> Modified:<br>
>    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
>    cfe/trunk/lib/Sema/SemaDecl.cpp<br>
><br>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=150128&r1=150127&r2=150128&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=150128&r1=150127&r2=150128&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Feb  8 19:21:34 2012<br>
> @@ -163,7 +163,9 @@<br>
>  def warn_return_value_size: Warning<<br>
>   "return value of %0 is a large (%1 bytes) pass-by-value object; "<br>
>   "pass it by reference instead ?">, InGroup<LargeByValueCopy>;<br>
> -<br>
> +def warn_return_value_udt: Warning<<br>
> +  "%0 has C-linkage specified, but returns user-defined type %1 which is "<br>
> +  "incompatible with C">, InGroup<ReturnType>;<br>
>  def warn_implicit_function_decl : Warning<<br>
>   "implicit declaration of function %0">,<br>
>   InGroup<ImplicitFunctionDeclare>, DefaultIgnore;<br>
><br>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=150128&r1=150127&r2=150128&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=150128&r1=150127&r2=150128&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br>
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Feb  8 19:21:34 2012<br>
> @@ -5774,6 +5774,17 @@<br>
>         Context.BuiltinInfo.ForgetBuiltin(BuiltinID, Context.Idents);<br>
>       }<br>
>     }<br>
> +<br>
> +    // If this function is declared as being extern "C", then check to see if<br>
> +    // the function returns a UDT (class, struct, or union type) that is not C<br>
> +    // compatible, and if it does, warn the user.<br>
> +    if (NewFD->isExternC()) {<br>
> +      QualType R = NewFD->getResultType();<br>
> +      if (!R.isPODType(Context) &&<br>
> +          !R->isVoidType())<br>
> +        Diag( NewFD->getLocation(), diag::warn_return_value_udt )<br>
> +          << NewFD << R;<br>
> +    }<br>
>   }<br>
>   return Redeclaration;<br>
>  }<br>
><br>
> Added: cfe/trunk/test/SemaCXX/function-extern-c.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/function-extern-c.cpp?rev=150128&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/function-extern-c.cpp?rev=150128&view=auto</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/SemaCXX/function-extern-c.cpp (added)<br>
> +++ cfe/trunk/test/SemaCXX/function-extern-c.cpp Wed Feb  8 19:21:34 2012<br>
> @@ -0,0 +1,38 @@<br>
> +// RUN: %clang_cc1 -Wreturn-type -fsyntax-only -std=c++11 -verify %s<br>
> +<br>
> +class A {<br>
> +public:<br>
> +  A(const A&);<br>
> +};<br>
> +<br>
> +struct S {<br>
> +  int i;<br>
> +  double d;<br>
> +<br>
> +  virtual void B() {}<br>
> +};<br>
> +<br>
> +union U {<br>
> +  struct {<br>
> +    int i;<br>
> +    virtual void B() {} // Can only do this in C++11<br>
> +  } t;<br>
> +};<br>
> +<br>
> +struct S2 {<br>
> +  int i;<br>
> +  double d;<br>
> +};<br>
> +<br>
> +extern "C" U f3( void ); // expected-warning {{'f3' has C-linkage specified, but returns user-defined type 'U' which is incompatible with C}}<br>
> +extern "C" S f0(void); // expected-warning {{'f0' has C-linkage specified, but returns user-defined type 'S' which is incompatible with C}}<br>
> +extern "C" A f4( void ); // expected-warning {{'f4' has C-linkage specified, but returns user-defined type 'A' which is incompatible with C}}<br>
> +<br>
> +// These should all be fine<br>
> +extern "C" S2 f5( void );<br>
> +extern "C" void f2( A x );<br>
> +extern "C" void f6( S s );<br>
> +extern "C" void f7( U u );<br>
> +extern "C" double f8(void);<br>
> +extern "C" long long f11( void );<br>
> +extern "C" A *f10( void );<br>
><br>
> Propchange: cfe/trunk/test/SemaCXX/function-extern-c.cpp<br>
> ------------------------------------------------------------------------------<br>
>    svn:eol-style = native<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br>