[cfe-commits] r155163 - in /cfe/trunk: lib/Parse/ParseTentative.cpp test/FixIt/fixit.cpp

David Blaikie dblaikie at gmail.com
Thu Apr 19 16:54:20 PDT 2012


On Thu, Apr 19, 2012 at 4:17 PM, Kaelyn Uhrain <rikka at google.com> wrote:
> Author: rikka
> Date: Thu Apr 19 18:17:45 2012
> New Revision: 155163
>
> URL: http://llvm.org/viewvc/llvm-project?rev=155163&view=rev
> Log:
> In Parser::isCXXDeclarationSpecifier, consider a non-type identifier
> followed by an identifier as declaration specificer (except for ObjC).
> This allows e.g. an out-of-line C++ member function definitions to be
> recognized as functions and not as variable declarations if the type
> name for the first parameter is not recognized as a type--say, when there
> is a function name shadowing an enum type name and the parameter is
> missing the "enum" keyword needed to distinguish the two.
>
> Note that returning TPResult::Error() instead of TPResult::True()
> appears to have the same end result, while TPResult::Ambiguous()
> results in a crash.
>
> Modified:
>    cfe/trunk/lib/Parse/ParseTentative.cpp
>    cfe/trunk/test/FixIt/fixit.cpp
>
> Modified: cfe/trunk/lib/Parse/ParseTentative.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseTentative.cpp?rev=155163&r1=155162&r2=155163&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseTentative.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseTentative.cpp Thu Apr 19 18:17:45 2012
> @@ -931,8 +931,12 @@
>     // recurse to handle whatever we get.
>     if (TryAnnotateTypeOrScopeToken())
>       return TPResult::Error();
> -    if (Tok.is(tok::identifier))
> -      return TPResult::False();
> +    if (Tok.is(tok::identifier)) {
> +      const Token &Next = NextToken();
> +      bool NotObjC = !(getLangOpts().ObjC1 || getLangOpts().ObjC2);
> +      return (NotObjC && Next.is(tok::identifier)) ?
> +          TPResult::True() : TPResult::False();
> +    }
>     return isCXXDeclarationSpecifier(BracedCastResult);
>
>   case tok::coloncolon: {    // ::foo::bar
>
> Modified: cfe/trunk/test/FixIt/fixit.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/FixIt/fixit.cpp?rev=155163&r1=155162&r2=155163&view=diff
> ==============================================================================
> --- cfe/trunk/test/FixIt/fixit.cpp (original)
> +++ cfe/trunk/test/FixIt/fixit.cpp Thu Apr 19 18:17:45 2012
> @@ -204,3 +204,15 @@
>          template<typename> typename Bar, // expected-error {{template template parameter requires 'class' after the parameter list}}
>          template<typename> struct Baz> // expected-error {{template template parameter requires 'class' after the parameter list}}
>  void func();
> +
> +
> +namespace ShadowedTagType {
> +class Foo {
> + public:
> +  enum Bar { X, Y };
> +  void SetBar(Bar bar);
> +  Bar Bar();
> + private:
> +  Bar bar_; // expected-error {{must use 'enum' tag to refer to type 'Bar' in this scope}}
> +};
> +void Foo::SetBar(Bar bar) { bar_ = bar; } // expected-error {{must use 'enum' tag to refer to type 'Bar' in this scope}}

I assume "void Foo::SetBar(Bar) { }" still confuses clang into
thinking this is a variable definition?




More information about the cfe-commits mailing list