On Wed, Jan 2, 2013 at 9:58 AM, Daniel Jasper <[email protected]> wrote: > The CL description is not precise enough (see patch). The unary operators we > use are: +, ++, -, --, !, ~ and alignof. Also there is a precedence in the > detection, so it actually formats: > > int* a = *++i;
Oh, OK, fair enough then - I didn't see any test cases that demonstrated this so I wasn't sure. Perhaps you could add some. > > I am sure there are still cases we are missing, but this should be an > improvement. Feel free to file further bugs. > > > On Wed, Jan 2, 2013 at 6:47 PM, David Blaikie <[email protected]> wrote: >> >> On Wed, Jan 2, 2013 at 9:21 AM, Daniel Jasper <[email protected]> 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. >> >> That doesn't quite sound correct - what about cases where */& are >> actually unary operators even when they're followed by another unary >> operator? >> >> iter x; >> func(&*x); >> >> void func(int **x) { >> **x = 3; >> } >> >> etc... (certainly *++x wouldn't be too uncommon, again with iterators, >> but any combination could be possible with arbitrary operator >> overloads, though I'm not sure how much you want/need to bother >> accounting for that kind of code) >> >> > >> > 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; >> > 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 >> > [email protected] >> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
