diff options
| -rw-r--r-- | clang/lib/Format/FormatToken.h | 6 | ||||
| -rw-r--r-- | clang/lib/Format/TokenAnnotator.cpp | 10 | ||||
| -rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 9 | 
3 files changed, 17 insertions, 8 deletions
diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index c5db18c8e0e..f50558c6ecf 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -525,6 +525,8 @@ private:  /// properly supported by Clang's lexer.  struct AdditionalKeywords {    AdditionalKeywords(IdentifierTable &IdentTable) { +    kw_final = &IdentTable.get("final"); +    kw_override = &IdentTable.get("override");      kw_in = &IdentTable.get("in");      kw_CF_ENUM = &IdentTable.get("CF_ENUM");      kw_CF_OPTIONS = &IdentTable.get("CF_OPTIONS"); @@ -538,7 +540,6 @@ struct AdditionalKeywords {      kw_abstract = &IdentTable.get("abstract");      kw_extends = &IdentTable.get("extends"); -    kw_final = &IdentTable.get("final");      kw_implements = &IdentTable.get("implements");      kw_instanceof = &IdentTable.get("instanceof");      kw_interface = &IdentTable.get("interface"); @@ -562,6 +563,8 @@ struct AdditionalKeywords {    }    // Context sensitive keywords. +  IdentifierInfo *kw_final; +  IdentifierInfo *kw_override;    IdentifierInfo *kw_in;    IdentifierInfo *kw_CF_ENUM;    IdentifierInfo *kw_CF_OPTIONS; @@ -578,7 +581,6 @@ struct AdditionalKeywords {    // Java keywords.    IdentifierInfo *kw_abstract;    IdentifierInfo *kw_extends; -  IdentifierInfo *kw_final;    IdentifierInfo *kw_implements;    IdentifierInfo *kw_instanceof;    IdentifierInfo *kw_interface; diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 381433484de..50e04310b63 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -1139,9 +1139,11 @@ private:        return TT_UnaryOperator;      const FormatToken *NextToken = Tok.getNextNonComment(); -    if (!NextToken || NextToken->is(tok::arrow) || +    if (!NextToken || +        NextToken->isOneOf(tok::arrow, Keywords.kw_final, +                           Keywords.kw_override) ||          (NextToken->is(tok::l_brace) && !NextToken->getNextNonComment())) -      return TT_Unknown; +      return TT_PointerOrReference;      if (PrevToken->is(tok::coloncolon))        return TT_PointerOrReference; @@ -1855,7 +1857,9 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,          !Line.IsMultiVariableDeclStmt)))      return true;    if (Left.is(TT_PointerOrReference)) -    return Right.Tok.isLiteral() || Right.is(TT_BlockComment) || +    return Right.Tok.isLiteral() || +           Right.isOneOf(TT_BlockComment, Keywords.kw_final, +                         Keywords.kw_override) ||             (Right.is(tok::l_brace) && Right.BlockKind == BK_Block) ||             (!Right.isOneOf(TT_PointerOrReference, TT_ArraySubscriptLSquare,                             tok::l_paren) && diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 0f4e46436b4..37516973929 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -5326,6 +5326,9 @@ TEST_F(FormatTest, UnderstandsFunctionRefQualification) {    verifyFormat("Deleted &operator=(const Deleted &)&&;");    verifyFormat("SomeType MemberFunction(const Deleted &)&;");    verifyFormat("SomeType MemberFunction(const Deleted &)&&;"); +  verifyFormat("SomeType MemberFunction(const Deleted &)&& {}"); +  verifyFormat("SomeType MemberFunction(const Deleted &)&& final {}"); +  verifyFormat("SomeType MemberFunction(const Deleted &)&& override {}");    verifyGoogleFormat("Deleted& operator=(const Deleted&)& = default;");    verifyGoogleFormat("SomeType MemberFunction(const Deleted&)& = delete;"); @@ -5583,11 +5586,11 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {    // Member function reference qualifiers aren't binary operators.    verifyFormat("string // break\n" -               "operator()() & {}"); +               "operator()()& {}");    verifyFormat("string // break\n" -               "operator()() && {}"); +               "operator()()&& {}");    verifyGoogleFormat("template <typename T>\n" -                     "auto x() & -> int {}"); +                     "auto x()& -> int {}");  }  TEST_F(FormatTest, UnderstandsAttributes) {  | 

