Author: Krasimir Georgiev Date: 2020-01-17T13:33:41+01:00 New Revision: 33463cfba2be7c8d6c08e666123cc34f114a1f3e
URL: https://github.com/llvm/llvm-project/commit/33463cfba2be7c8d6c08e666123cc34f114a1f3e DIFF: https://github.com/llvm/llvm-project/commit/33463cfba2be7c8d6c08e666123cc34f114a1f3e.diff LOG: clang-format: fix spacing in `operator const char*()` Summary: Revision a75f8d98d7ac9e557b238a229a9a2647c71feed1 fixed spacing for operators, but caused the const and non-const versions to diverge: ``` // With Style.PointerAlignment = FormatStyle::PAS_Left: struct A { operator char*() { return ""; } operator const char *() const { return ""; } }; ``` The code was checking if the type specifier was directly preceded by `operator`. However there could be comments and `const/volatile` in between. Reviewers: mprobst Reviewed By: mprobst Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D72911 Added: Modified: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index d5d394e61926..21a2184bf1d8 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -2707,10 +2707,17 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, return false; if (Right.isOneOf(tok::star, tok::amp, tok::ampamp) && (Left.is(tok::identifier) || Left.isSimpleTypeSpecifier()) && - Left.Previous && Left.Previous->is(tok::kw_operator)) - // Space between the type and the * - // operator void*(), operator char*(), operator Foo*() dependant - // on PointerAlignment style. + // Space between the type and the * in: + // operator void*() + // operator char*() + // operator /*comment*/ const char*() + // operator volatile /*comment*/ char*() + // operator Foo*() + // dependent on PointerAlignment style. + Left.Previous && + (Left.Previous->endsSequence(tok::kw_operator) || + Left.Previous->endsSequence(tok::kw_const, tok::kw_operator) || + Left.Previous->endsSequence(tok::kw_volatile, tok::kw_operator))) return (Style.PointerAlignment != FormatStyle::PAS_Left); const auto SpaceRequiredForArrayInitializerLSquare = [](const FormatToken &LSquareTok, const FormatStyle &Style) { diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 2d67b9759d7f..d689658f99b6 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -15007,6 +15007,9 @@ TEST_F(FormatTest, OperatorSpacing) { Style.PointerAlignment = FormatStyle::PAS_Left; verifyFormat("Foo::operator*();", Style); verifyFormat("Foo::operator void*();", Style); + verifyFormat("Foo::operator/*comment*/ void*();", Style); + verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style); + verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style); verifyFormat("Foo::operator()(void*);", Style); verifyFormat("Foo::operator*(void*);", Style); verifyFormat("Foo::operator*();", Style); @@ -15014,6 +15017,9 @@ TEST_F(FormatTest, OperatorSpacing) { verifyFormat("Foo::operator&();", Style); verifyFormat("Foo::operator void&();", Style); + verifyFormat("Foo::operator/*comment*/ void&();", Style); + verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style); + verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style); verifyFormat("Foo::operator()(void&);", Style); verifyFormat("Foo::operator&(void&);", Style); verifyFormat("Foo::operator&();", Style); @@ -15021,6 +15027,9 @@ TEST_F(FormatTest, OperatorSpacing) { verifyFormat("Foo::operator&&();", Style); verifyFormat("Foo::operator void&&();", Style); + verifyFormat("Foo::operator/*comment*/ void&&();", Style); + verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style); + verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style); verifyFormat("Foo::operator()(void&&);", Style); verifyFormat("Foo::operator&&(void&&);", Style); verifyFormat("Foo::operator&&();", Style); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits