r192200 - Add fixits suggesting parenthesis around type name in expressions like sizeof.

Serge Pavlov sepavloff at gmail.com
Tue Oct 8 11:35:38 PDT 2013


Fixed in 192208.
Sorry.


2013/10/9 jahanian <fjahanian at apple.com>

> These tests are failing on a windows buildbot.
>
> Failing Tests (3):
>       Clang :: CXX/dcl.dcl/dcl.attr/dcl.align/p7.cpp
>       Clang :: CXX/expr/expr.unary/expr.sizeof/p1.cpp
>       Clang :: Parser/expressions.c
>
>
> - Fariborz
>
> On Oct 8, 2013, at 9:56 AM, Serge Pavlov <sepavloff at gmail.com> wrote:
>
> Author: sepavloff
> Date: Tue Oct  8 11:56:30 2013
> New Revision: 192200
>
> URL: http://llvm.org/viewvc/llvm-project?rev=192200&view=rev
> Log:
> Add fixits suggesting parenthesis around type name in expressions like
> sizeof.
> This fixes PR16992 - Fixit missing when "sizeof type" found.
>
> Modified:
>    cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
>    cfe/trunk/lib/Parse/ParseExpr.cpp
>    cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p7.cpp
>    cfe/trunk/test/CXX/expr/expr.unary/expr.sizeof/p1.cpp
>    cfe/trunk/test/Parser/expressions.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=192200&r1=192199&r2=192200&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Tue Oct  8
> 11:56:30 2013
> @@ -310,6 +310,8 @@ def err_unspecified_vla_size_with_static
> def warn_deprecated_register : Warning<
>   "'register' storage class specifier is deprecated">,
>   InGroup<DeprecatedRegister>;
> +def err_missed_parenthesis_around_typename : Error<
> +  "missed parenthesis around the type name in %0">;
>
> def err_expected_case_before_expression: Error<
>   "expected 'case' keyword before expression">;
>
> Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=192200&r1=192199&r2=192200&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseExpr.cpp Tue Oct  8 11:56:30 2013
> @@ -1589,6 +1589,28 @@ Parser::ParseExprAfterUnaryExprOrTypeTra
>
>   // If the operand doesn't start with an '(', it must be an expression.
>   if (Tok.isNot(tok::l_paren)) {
> +    // If construct allows a form without parenthesis, user may forget to
> put
> +    // pathenthesis around type name.
> +    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)) {
> +        DeclSpec DS(AttrFactory);
> +        ParseSpecifierQualifierList(DS);
> +        Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
> +        ParseDeclarator(DeclaratorInfo);
> +
> +        SourceLocation LParenLoc =
> PP.getLocForEndOfToken(OpTok.getLocation());
> +        SourceLocation RParenLoc =
> PP.getLocForEndOfToken(PrevTokLocation);
> +        Diag(LParenLoc, diag::err_missed_parenthesis_around_typename)
> +          << OpTok.getName()
> +          << FixItHint::CreateInsertion(LParenLoc, "(")
> +          << FixItHint::CreateInsertion(RParenLoc, ")");
> +        isCastExpr = true;
> +        return ExprEmpty();
> +      }
> +    }
> +
>     isCastExpr = false;
>     if (OpTok.is(tok::kw_typeof) && !getLangOpts().CPlusPlus) {
>       Diag(Tok,diag::err_expected_lparen_after_id) <<
> OpTok.getIdentifierInfo();
>
> Modified: cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p7.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p7.cpp?rev=192200&r1=192199&r2=192200&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p7.cpp (original)
> +++ cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p7.cpp Tue Oct  8
> 11:56:30 2013
> @@ -14,3 +14,7 @@ template<typename T, typename A, int N>
>
> static_assert(alignof(Y<char, int, sizeof(int)>) == alignof(int), "");
> static_assert(alignof(Y<int, char, 1>) == alignof(int), ""); //
> expected-note {{in instantiation of}}
> +
> +void pr16992 () {
> +  int x = alignof int;  // expected-error{{missed parenthesis around the
> type name in alignof}}
> +}
>
> Modified: cfe/trunk/test/CXX/expr/expr.unary/expr.sizeof/p1.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/expr/expr.unary/expr.sizeof/p1.cpp?rev=192200&r1=192199&r2=192200&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CXX/expr/expr.unary/expr.sizeof/p1.cpp (original)
> +++ cfe/trunk/test/CXX/expr/expr.unary/expr.sizeof/p1.cpp Tue Oct  8
> 11:56:30 2013
> @@ -26,3 +26,23 @@ void test2() {
>   x = sizeof(test2()); // expected-error {{invalid application of 'sizeof'
> to an incomplete type 'void'}}
>   x = sizeof(test2); // expected-error {{invalid application of 'sizeof'
> to a function type}}
> }
> +
> +namespace pr16992 {
> +
> +template<typename T> struct ABC {
> +  int func () {
> +    return sizeof T;  //expected-error{{missed parenthesis around the
> type name in sizeof}}
> +  }
> +};
> +
> +ABC<int> qq;
> +
> +template<typename T> struct ABC2 {
> +  int func () {
> +    return sizeof T::A;
> +  }
> +};
> +
> +struct QQ { int A; };
> +ABC2<QQ> qq2;
> +}
>
> Modified: cfe/trunk/test/Parser/expressions.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/expressions.c?rev=192200&r1=192199&r2=192200&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Parser/expressions.c (original)
> +++ cfe/trunk/test/Parser/expressions.c Tue Oct  8 11:56:30 2013
> @@ -57,3 +57,13 @@ void test7() {
>     ({} // expected-note {{to match}}
>     ;   // expected-error {{expected ')'}}
> }
> +
> +// PR16992
> +struct pr16992 { int x; };
> +
> +void func_16992 () {
> +  int x1 = sizeof int;  // expected-error{{missed parenthesis around the
> type name in sizeof}}
> +  int x2 = sizeof struct pr16992;  // expected-error{{missed parenthesis
> around the type name in sizeof}}
> +  int x3 = __alignof int;  // expected-error{{missed parenthesis around
> the type name in __alignof}}
> +  int x4 = _Alignof int;  // expected-error{{missed parenthesis around
> the type name in _Alignof}}
> +}
>
>
> _______________________________________________
> 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/20131009/a1f43c69/attachment.html>


More information about the cfe-commits mailing list