diff options
author | Daniel Jasper <djasper@google.com> | 2013-01-02 17:21:36 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2013-01-02 17:21:36 +0000 |
commit | ba3d3074e8ef4c4c05ac062b073b2e082e6a0206 (patch) | |
tree | 89ecc35d662b1e650f5c56ae12e8b9a68c07c9f6 | |
parent | a080a187fa7e538da3212c7d5e678e4b7ae03253 (diff) |
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 :-)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171396 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Format/Format.cpp | 14 | ||||
-rw-r--r-- | unittests/Format/FormatTest.cpp | 10 |
2 files changed, 19 insertions, 5 deletions
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 8ea95c4862..3c337ec063 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -835,19 +835,23 @@ private: } 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 @@ private: 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; } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index daae94bb13..574d685fbd 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -28,6 +28,7 @@ protected: CharSourceRange::getCharRange(Start, Start.getLocWithOffset(Length))); LangOptions LangOpts; LangOpts.CPlusPlus = 1; + LangOpts.CPlusPlus11 = 1; Lexer Lex(ID, Context.Sources.getBuffer(ID), Context.Sources, LangOpts); tooling::Replacements Replace = reformat(Style, Lex, Context.Sources, Ranges); @@ -676,7 +677,9 @@ TEST_F(FormatTest, UnderstandsUnaryOperators) { 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 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 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;"); |