[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