[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