[PATCH] Fixed error recovery if sizeof is used without parenthesis
Serge Pavlov
sepavloff at gmail.com
Mon Jan 13 01:06:46 PST 2014
Any comments?
2013/12/19 Serge Pavlov <sepavloff at gmail.com>
> sepavloff added you to the CC list for the revision "Fixed error recovery
> if sizeof is used without parenthesis".
>
> Changes made in r192200 fixed PR16992, which requested fixit suggesting
> parenthesis if sizeof is followed by type-id. However expression in form
> T() followed by ')' was incorrectly considered as a type-id if 'T' is
> typedef name. This change fixes this case.
>
> http://llvm-reviews.chandlerc.com/D2440
>
> Files:
> include/clang/Parse/Parser.h
> lib/Parse/ParseExpr.cpp
> lib/Parse/ParseTentative.cpp
> test/SemaCXX/expressions.cpp
>
> Index: include/clang/Parse/Parser.h
> ===================================================================
> --- include/clang/Parse/Parser.h
> +++ include/clang/Parse/Parser.h
> @@ -1772,6 +1772,7 @@
> /// disambiguation will occur.
> enum TentativeCXXTypeIdContext {
> TypeIdInParens,
> + TypeIdSeparate,
> TypeIdAsTemplateArgument
> };
>
> @@ -1790,6 +1791,16 @@
> return isTypeIdInParens(isAmbiguous);
> }
>
> + /// \brief Checks if the current tokens form type-id or expression.
> + /// It is similar to isTypeIdInParens but does not suppose that type-id
> + /// is in parenthesis.
> + bool isTypeIdSeparate(bool &isAmbiguous) {
> + if (getLangOpts().CPlusPlus)
> + return isCXXTypeId(TypeIdSeparate, isAmbiguous);
> + isAmbiguous = false;
> + return isTypeSpecifierQualifier();
> + }
> +
> /// isCXXDeclarationStatement - C++-specialized function that
> disambiguates
> /// between a declaration or an expression statement, when parsing
> function
> /// bodies. Returns true for declaration, false for expression.
> Index: lib/Parse/ParseExpr.cpp
> ===================================================================
> --- lib/Parse/ParseExpr.cpp
> +++ lib/Parse/ParseExpr.cpp
> @@ -1493,7 +1493,7 @@
> if (OpTok.is(tok::kw_sizeof) || OpTok.is(tok::kw___alignof) ||
> OpTok.is(tok::kw_alignof) || OpTok.is(tok::kw__Alignof)) {
> bool isAmbiguousTypeId;
> - if (isTypeIdInParens(isAmbiguousTypeId)) {
> + if (isTypeIdSeparate(isAmbiguousTypeId)) {
> DeclSpec DS(AttrFactory);
> ParseSpecifierQualifierList(DS);
> Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
> Index: lib/Parse/ParseTentative.cpp
> ===================================================================
> --- lib/Parse/ParseTentative.cpp
> +++ lib/Parse/ParseTentative.cpp
> @@ -437,9 +437,12 @@
> TPR = TPResult::True();
>
> if (TPR == TPResult::Ambiguous()) {
> + if (Context == TypeIdSeparate)
> + TPR = TPResult::False();
> +
> // We are supposed to be inside parens, so if after the abstract
> declarator
> // we encounter a ')' this is a type-id, otherwise it's an expression.
> - if (Context == TypeIdInParens && Tok.is(tok::r_paren)) {
> + else if (Context == TypeIdInParens && Tok.is(tok::r_paren)) {
> TPR = TPResult::True();
> isAmbiguous = true;
>
> Index: test/SemaCXX/expressions.cpp
> ===================================================================
> --- test/SemaCXX/expressions.cpp
> +++ test/SemaCXX/expressions.cpp
> @@ -118,3 +118,10 @@
> (void)s1.foo();
> (void)s2.foo();
> }
> +
> +namespace pr16992 {
> + typedef int T;
> + unsigned getsz() {
> + return (sizeof T());
> + }
> +}
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
--
Thanks,
--Serge
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140113/80e40f79/attachment.html>
More information about the cfe-commits
mailing list