Ping.<div><br></div><div>Unless I hear something, I'll go ahead and commit the patch tomorrow morning.<br><br><div class="gmail_quote">On Wed, Apr 11, 2012 at 1:44 PM, Kaelyn Uhrain <span dir="ltr"><<a href="mailto:rikka@google.com">rikka@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<div><br></div><div>This warning is to help make code like:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div><div>class Foo {</div></div><div><div> public:</div></div><div><div>  enum Bar { X, Y };</div>
</div><div><div>  void SetBar(Bar bar);  // Setter</div></div><div><div>  Bar Bar()  // Getter</div></div><div><div> private:</div></div><div><div>  Bar bar_;</div></div><div><div>};</div></div><div><div>void Foo::SetBar(Bar bar) { bar_ = bar; }</div>

</div><div>Foo::Bar Foo::Bar() { return bar_; }</div></blockquote><div><br></div><div>be a bit easier to diagnose. Currently clang spits out a bunch of errors without any real indication of what went wrong (the first error is the only remotely helpful one, but it doesn't give any reason why an 'enum' tag has to be added):</div>

<div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div>tmp.cc:7:3: error: must use 'enum' tag to refer to type 'Bar' in this scope</div></div><div><div>  Bar bar_;</div></div>

<div><div>  ^</div></div><div><div>  enum </div></div><div><div>tmp.cc:9:11: error: variable has incomplete type 'void'</div></div><div><div>void Foo::SetBar(Bar bar) { bar_ = bar; }</div></div><div><div>          ^</div>

</div><div><div>tmp.cc:9:18: error: use of undeclared identifier 'Bar'</div></div><div><div>void Foo::SetBar(Bar bar) { bar_ = bar; }</div></div><div><div>                 ^</div></div><div><div>tmp.cc:9:26: error: expected ';' after top level declarator</div>

</div><div><div>void Foo::SetBar(Bar bar) { bar_ = bar; }</div></div><div><div>                         ^</div></div><div><div>                         ;</div></div><div><div>4 errors generated.</div></div></blockquote><div>

<br></div><div>With the patch, clang emits a warning before that cascade of errors:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div>tmp.cc:5:7: warning: function 'Bar' shadows enum 'Bar'; uses of enum 'Bar' will require an 'enum'</div>

</div><div><div>      tag [-Wshadow]</div></div><div><div>  Bar Bar();  // Getter</div></div><div><div>      ^</div></div><div><div>tmp.cc:3:3: note: 'Bar' declared here</div></div><div><div>  enum Bar { X, Y };</div>

</div><div><div>  ^</div></div><div><div>tmp.cc:7:3: error: must use 'enum' tag to refer to type 'Bar' in this scope</div></div><div><and the rest of the messages from the first output example></div>

</blockquote><br><div>I'm sending the patch for pre-commit review both because I'm uncertain about the wording of the wording, and primarily because I'm not sure that modifying Sema::ActOnStartFunctionDeclarator is the right place for the check (though it was the best candidate I could find).</div>

<div><br></div><div>I'd also like to clean up the errors (in a separate patch) but the errors seem to involve a lot of interactions between the parser and sema and may take a while for me to figure out how to get things to work right. ;)</div>

<div><br></div><div>Cheers,</div><div>Kaelyn</div>
</blockquote></div><br></div>