Index: cfe/trunk/lib/Format/TokenAnnotator.h =================================================================== --- cfe/trunk/lib/Format/TokenAnnotator.h +++ cfe/trunk/lib/Format/TokenAnnotator.h @@ -99,9 +99,17 @@ /// function declaration. Asserts MightBeFunctionDecl. bool mightBeFunctionDefinition() const { assert(MightBeFunctionDecl); - // FIXME: Line.Last points to other characters than tok::semi - // and tok::lbrace. - return !Last->isOneOf(tok::semi, tok::comment); + // Try to determine if the end of a stream of tokens is either the + // Definition or the Declaration for a function. It does this by looking for + // the ';' in foo(); and using that it ends with a ; to know this is the + // Definition, however the line could end with + // foo(); /* comment */ + // or + // foo(); // comment + // or + // foo() // comment + // endsWith() ignores the comment. + return !endsWith(tok::semi); } /// \c true if this line starts a namespace definition. Index: cfe/trunk/unittests/Format/FormatTest.cpp =================================================================== --- cfe/trunk/unittests/Format/FormatTest.cpp +++ cfe/trunk/unittests/Format/FormatTest.cpp @@ -5768,6 +5768,26 @@ " return a;\n" "}\n", Style); + + Style = getGNUStyle(); + + // Test for comments at the end of function declarations. + verifyFormat("void\n" + "foo (int a, /*abc*/ int b) // def\n" + "{\n" + "}\n", + Style); + + verifyFormat("void\n" + "foo (int a, /* abc */ int b) /* def */\n" + "{\n" + "}\n", + Style); + + // Definitions that should not break after return type + verifyFormat("void foo (int a, int b); // def\n", Style); + verifyFormat("void foo (int a, int b); /* def */\n", Style); + verifyFormat("void foo (int a, int b);\n", Style); } TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {