On Mon, Aug 5, 2013 at 11:45 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>On Mon, Aug 5, 2013 at 11:40 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>> wrote:<br>
> The code is ill-formed. We're supposed to catch this due to<br>
> [basic.scope.block]p2: "A parameter name shall not be redeclared in the<br>
> outermost block of the function definition" but our check for that seems to<br>
> be broken or missing.<br>
<br>
</div>Broken - I believe I was the last one to muck with this in an effort<br>
to have it catch the same case, but with function-try blocks. I may've<br>
broken something while I was there, or perhaps this case was always<br>
broken.<br>
<br>
Simple case working:<br>
<br>
$ cat scope.cpp<br>
void func(int i) {<br>
  int i;<br>
}<br>
blaikie@blaikie:~/dev/scratch$ clang++-tot scope.cpp<br>
scope.cpp:2:7: error: redefinition of 'i'<br>
  int i;<br>
      ^<br>
scope.cpp:1:15: note: previous definition is here<br>
void func(int i) {<br>
              ^<br>
1 error generated.<br>
<br>
I think that's Clang's implementation of that rule, at least - though<br>
I could be wrong.</blockquote><div><br></div><div>Hmm, we're only diagnosing here because both declarations are definitions (which is why adding 'extern' causes us to accept it). Trying to reuse the redefinition check to catch this is clever, but wrong.</div>
<div><br></div><div>We also miss this case:</div><div><br></div><div>void f(int n) try {} catch (int n) {}</div><div><br></div><div>... though we diagnose it if 'n' is instead redefined inside either pair of {}.</div>
<div><br></div><div>And we get this case wrong too:</div><div><br></div><div>int i;</div><div>void f(int i) {{</div><div>  extern int i;</div><div>}}</div><div><br></div><div>... because we don't notice that the innermost 'i' is a redeclaration of the outermost one (though that's probably more part of PR7560 than this bug).</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>
><br>
> On Mon, Aug 5, 2013 at 8:25 PM, Tom Honermann <<a href="mailto:thonermann@coverity.com" target="_blank">thonermann@coverity.com</a>><br>
> wrote:<br>
>><br>
>> Clang 3.3, when compiled with assertions enabled, fails an assertion for<br>
>> the following test case.  I believe this code is ill-formed, but at least<br>
>> some versions of gcc accept this test case (I tested 4.6.3 and 4.8.0).<br>
>> Clang 3.2 accepts this test case as well.<br>
>><br>
>> I filed a bug report for the assertion failure [1], but thought it would<br>
>> be good to clarify expected behavior on the mailing list.<br>
>><br>
>> $ cat t.cpp<br>
>> struct S;<br>
>> void f(S *s) {<br>
>>     extern S *s;<br>
>>     s;<br>
>> }<br>
>><br>
>> $ clang --version<br>
>> clang version 3.3 (tags/RELEASE_33/final)<br>
>> Target: x86_64-unknown-linux-gnu<br>
>> Thread model: posix<br>
>><br>
>> $ clang -c t.cpp<br>
>> clang: llvm-3.3/tools/clang/lib/AST/Decl.cpp:932: void<br>
>> clang::NamedDecl::verifyLinkage() const: Assertion `!D || D->CachedLinkage<br>
>> == CachedLinkage' failed.<br>
>><br>
>> [1]: <a href="http://llvm.org/bugs/show_bug.cgi?id=16804" target="_blank">http://llvm.org/bugs/show_bug.cgi?id=16804</a><br>
>><br>
>> Tom.<br>
>><br>
>> _______________________________________________<br>
>> cfe-dev mailing list<br>
>> <a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
><br>
><br>
><br>
> _______________________________________________<br>
> cfe-dev mailing list<br>
> <a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
><br>
</div></div></blockquote></div><br>