diff --git a/src/file_linter.cpp b/src/file_linter.cpp index fd9644f..4692b71 100644 --- a/src/file_linter.cpp +++ b/src/file_linter.cpp @@ -894,6 +894,8 @@ void FileLinter::CheckTrailingSemicolon(const CleansedLines& clean_lines, RegexCompile(R"(\b(?:struct|union)\s+alignas\s*$)"); static const regex_code RE_PATTERN_DECLTYPE = RegexCompile(R"(\bdecltype$)"); + static const regex_code RE_PATTERN_REQUIRES = + RegexCompile(R"(\brequires.*$)"); static const regex_code RE_PATTERN_INCOP = RegexCompile(R"(\s+=\s*$)"); if ((macro && !InStrVec({ @@ -905,6 +907,7 @@ void FileLinter::CheckTrailingSemicolon(const CleansedLines& clean_lines, GetMatchStrView(func_m, line_prefix, 1))) || RegexSearch(RE_PATTERN_ALIGNAS, line_prefix) || RegexSearch(RE_PATTERN_DECLTYPE, line_prefix) || + RegexSearch(RE_PATTERN_REQUIRES, line_prefix) || RegexSearch(RE_PATTERN_INCOP, line_prefix)) { match = false; } diff --git a/tests/lines_test.cpp b/tests/lines_test.cpp index bf3d7a3..f6c1efc 100644 --- a/tests/lines_test.cpp +++ b/tests/lines_test.cpp @@ -730,6 +730,25 @@ TEST_F(LinesLinterTest, TrailingSemicolonPass) { "func = []() {", " func();", "};", + "file_tocs_[i] = (FileToc) {a, b, c};", + "class X : public Y,", "public Z {};", + }); + EXPECT_EQ(0, cpplint_state.ErrorCount()); +} + +TEST_F(LinesLinterTest, TrailingSemicolonWithConceptPass) { + ProcessLines({ + "#include ", + "template", + "concept C = requires(T a, T b) {", + " requires a == b;", + "};", + "template ", + "concept C = (std::integral || std::floating_point) &&", + " (std::integral || std::floating_point) &&", + " requires(T t, U u) {", + " std::min(static_cast(t), static_cast(u));", + "};", }); EXPECT_EQ(0, cpplint_state.ErrorCount()); }