[cfe-commits] r171396 - in /cfe/trunk: lib/Format/Format.cpp unittests/Format/FormatTest.cpp

Nico Weber thakis at chromium.org
Sat Jan 5 17:40:23 PST 2013


On Wed, Jan 2, 2013 at 9:21 AM, Daniel Jasper <djasper at google.com> wrote:
> Author: djasper
> Date: Wed Jan  2 11:21:36 2013
> New Revision: 171396
>
> URL: http://llvm.org/viewvc/llvm-project?rev=171396&view=rev
> Log:
> Format */& as binary operator if followed by a unary operator.
>
> This fixes llvm.org/PR14687.
> Also fixes segfault for lines starting with * or &.
>
> Before:
> a *~b;
> *a = 1;  // <- this segfaulted
>
> After:
> a * ~b;
> *a = 1;  // no segfault :-)
>
> Modified:
>     cfe/trunk/lib/Format/Format.cpp
>     cfe/trunk/unittests/Format/FormatTest.cpp
>
> Modified: cfe/trunk/lib/Format/Format.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=171396&r1=171395&r2=171396&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Format/Format.cpp (original)
> +++ cfe/trunk/lib/Format/Format.cpp Wed Jan  2 11:21:36 2013
> @@ -835,19 +835,23 @@
>    }
>
>    TokenAnnotation::TokenType determineStarAmpUsage(unsigned Index, bool IsRHS) {
> +    if (Index == 0)
> +      return TokenAnnotation::TT_UnaryOperator;
>      if (Index == Annotations.size())
>        return TokenAnnotation::TT_Unknown;
>      const FormatToken &PrevToken = Line.Tokens[Index - 1];
>      const FormatToken &NextToken = Line.Tokens[Index + 1];
>
> -    if (Index == 0 || PrevToken.Tok.is(tok::l_paren) ||
> -        PrevToken.Tok.is(tok::comma) || PrevToken.Tok.is(tok::kw_return) ||
> -        PrevToken.Tok.is(tok::colon) ||
> +    if (PrevToken.Tok.is(tok::l_paren) || PrevToken.Tok.is(tok::comma) ||
> +        PrevToken.Tok.is(tok::kw_return) || PrevToken.Tok.is(tok::colon) ||
>          Annotations[Index - 1].Type == TokenAnnotation::TT_BinaryOperator)
>        return TokenAnnotation::TT_UnaryOperator;
>
>      if (PrevToken.Tok.isLiteral() || NextToken.Tok.isLiteral() ||
> -        NextToken.Tok.is(tok::kw_sizeof))
> +        NextToken.Tok.is(tok::plus) || NextToken.Tok.is(tok::minus) ||
> +        NextToken.Tok.is(tok::plusplus) || NextToken.Tok.is(tok::minusminus) ||
> +        NextToken.Tok.is(tok::tilde) || NextToken.Tok.is(tok::exclaim) ||
> +        NextToken.Tok.is(tok::kw_alignof) || NextToken.Tok.is(tok::kw_sizeof))
>        return TokenAnnotation::TT_BinaryOperator;
>
>      if (NextToken.Tok.is(tok::comma) || NextToken.Tok.is(tok::r_paren) ||
> @@ -931,7 +935,7 @@
>        return Left.is(tok::kw_if) || Left.is(tok::kw_for) ||
>               Left.is(tok::kw_while) || Left.is(tok::kw_switch) ||
>               (Left.isNot(tok::identifier) && Left.isNot(tok::kw_sizeof) &&
> -              Left.isNot(tok::kw_typeof));
> +              Left.isNot(tok::kw_typeof) && Left.isNot(tok::kw_alignof));
>      }
>      return true;
>    }
>
> Modified: cfe/trunk/unittests/Format/FormatTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=171396&r1=171395&r2=171396&view=diff
> ==============================================================================
> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)
> +++ cfe/trunk/unittests/Format/FormatTest.cpp Wed Jan  2 11:21:36 2013
> @@ -28,6 +28,7 @@
>          CharSourceRange::getCharRange(Start, Start.getLocWithOffset(Length)));
>      LangOptions LangOpts;
>      LangOpts.CPlusPlus = 1;
> +    LangOpts.CPlusPlus11 = 1;

^ This is necessary to format "alignof" correctly, which is KEYCXX11
in TokenKinds.def, makes sense. However, ClangFormat.cpp did not get
this change as far as I can tell, so while this now works in tests,
clang-format still gets it wrong. Should there be a function
"getLangOpts()" that both ClangFormat.cpp and the test use, to make
sure they're in sync and the test is testing the production code? Or
do you think LangOpts changes are rare enough that just adding a
`LangOpts.CPlusPlus11 = 1;` to ClangFormat.cpp should be good enough?

>      Lexer Lex(ID, Context.Sources.getBuffer(ID), Context.Sources, LangOpts);
>      tooling::Replacements Replace =
>          reformat(Style, Lex, Context.Sources, Ranges);
> @@ -676,7 +677,9 @@
>    verifyFormat("a-- > b;");
>    verifyFormat("b ? -a : c;");
>    verifyFormat("n * sizeof char16;");
> +  verifyFormat("n * alignof char16;");
>    verifyFormat("sizeof(char);");
> +  verifyFormat("alignof(char);");
>
>    verifyFormat("return -1;");
>    verifyFormat("switch (a) {\n"
> @@ -724,6 +727,13 @@
>    verifyFormat("return a & ~b;");
>    verifyFormat("f(b ? *c : *d);");
>    verifyFormat("int a = b ? *c : *d;");
> +  verifyFormat("*b = a;");
> +  verifyFormat("a * ~b;");
> +  verifyFormat("a * !b;");
> +  verifyFormat("a * +b;");
> +  verifyFormat("a * -b;");
> +  verifyFormat("a * ++b;");
> +  verifyFormat("a * --b;");
>
>    // FIXME: Is this desired for LLVM? Fix if not.
>    verifyFormat("A<int *> a;");
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list