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

David Blaikie dblaikie at gmail.com
Wed Jan 2 10:02:32 PST 2013


On Wed, Jan 2, 2013 at 9:58 AM, Daniel Jasper <djasper at google.com> 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 <dblaikie at gmail.com> wrote:
>>
>> 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.
>>
>> 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
>> > cfe-commits at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>



More information about the cfe-commits mailing list