<html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></head><body><div><div style="font-family:Calibri,sans-serif;font-size:11pt">How would we detect the calls from c? The extern "c" stuff is ifdef'd out when compiling as c, isn't it?<br>
</div></div><hr><span style="font-family:Tahoma,sans-serif;font-size:10pt;font-weight:bold">From: </span><span style="font-family:Tahoma,sans-serif;font-size:10pt">Chandler Carruth</span><br><span style="font-family:Tahoma,sans-serif;font-size:10pt;font-weight:bold">Sent: </span><span style="font-family:Tahoma,sans-serif;font-size:10pt">2/16/2012 2:56 PM</span><br>
<span style="font-family:Tahoma,sans-serif;font-size:10pt;font-weight:bold">To: </span><span style="font-family:Tahoma,sans-serif;font-size:10pt">Aaron Ballman</span><br><span style="font-family:Tahoma,sans-serif;font-size:10pt;font-weight:bold">Cc: </span><span style="font-family:Tahoma,sans-serif;font-size:10pt"><a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a></span><br>
<span style="font-family:Tahoma,sans-serif;font-size:10pt;font-weight:bold">Subject: </span><span style="font-family:Tahoma,sans-serif;font-size:10pt">Re: [cfe-commits] r150128 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDecl.cpp test/SemaCXX/function-extern-c.cpp</span><br>
<br></body></html><div class="gmail_quote">On Thu, Feb 9, 2012 at 3:18 PM, Aaron Ballman <span dir="ltr"><<a href="mailto:aaron@aaronballman.com">aaron@aaronballman.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im">On Thu, Feb 9, 2012 at 5:04 PM, Chandler Carruth <<a href="mailto:chandlerc@google.com">chandlerc@google.com</a>> wrote:<br>
> On Thu, Feb 9, 2012 at 12:42 PM, Matt Beaumont-Gay <<a href="mailto:matthewbg@google.com">matthewbg@google.com</a>><br>
> wrote:<br>
>><br>
>> 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>
><br>
><br>
> I think that's a bug. Incomplete struct types are relatively common as<br>
> "opaque" return types.<br>
<br>
</div>Oddly enough, MSVC does complain on that code.<br>
<br>
error C2526: 'get_foo' : C linkage function cannot return C++ class 'foo'<br>
<br>
It's hard to really say one way or the other, since you can make a<br>
case either way.  Yes, it may be perfectly fine as an opaque type, but<br>
it may also contain non-C-compatible fields which would justify the<br>
warning.</blockquote><div><br></div><div>This warning is causing massive pain for our users. It has thus far found zero real bugs. I would like to disable it until you can change the logic to make it more accurate and have fewer false positives. Let me know if you have any strong objections to this, or if you already have the fixes in flight.</div>

<div><br></div><div>The specific problem is that warning on the declaration is fundamentally not sound -- there are clearly many reasons to declare a function which uses C++ return types but with C linkage. We've seen quite a few, some even within LLVM: the mangled name is much easier to deal with.</div>

<div><br></div><div>The *bug* is calling such a function from a C context. I think you should re-cast this warning to fire on *calls* rather than on *declarations* as that will be much less prone to false positives. Does this make sense?</div>

</div>