@@ -164,6 +164,40 @@ TEST_F(MatchFilePathTest, Path) {
164164 EXPECT_FALSE (match (" foo\\ " , R"( foo*\)" ));
165165}
166166
167+ TEST_F (MatchFilePathTest, DoubleAsterisk) {
168+ EXPECT_TRUE (match (" a/b/c/d.cpp" , " **b**" ));
169+ EXPECT_TRUE (match (" a/b/c/d.cpp" , " **/b/**" ));
170+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " **d_*" ));
171+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " **/d_*" ));
172+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " **d_**" ));
173+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " **/d_**" ));
174+
175+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " **/b/c/**" ));
176+
177+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " a/**/b/c/d_e.cpp" ));
178+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " a/**/c/d_e.cpp" ));
179+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " a/**/b/**/d_e.cpp" ));
180+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " **/b/**/d_e.cpp" ));
181+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " a/**/**/b/**" ));
182+
183+ EXPECT_FALSE (match (" a/b/c/d_e.cpp" , " **/d" ));
184+ EXPECT_FALSE (match (" a/b/c/d_e.cpp" , " **/b/d" ));
185+ EXPECT_FALSE (match (" a/b/c/d_e.cpp" , " **/b/d/**" ));
186+ EXPECT_FALSE (match (" a/b/c/d_e.cpp" , " **/b/c/" ));
187+
188+ // Multiple consecutive asterisks are treated as **
189+ EXPECT_TRUE (match (" a/b/c/d.cpp" , " ***b****" ));
190+ EXPECT_TRUE (match (" a/b/c/d.cpp" , " ****/b/***" ));
191+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " ***d_**" ));
192+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " ****/d_*" ));
193+ EXPECT_TRUE (match (" a/b/c/d_e.cpp" , " ***/b/c/*****" ));
194+
195+ EXPECT_FALSE (match (" a/b/c/d_e.cpp" , " *****/d" ));
196+ EXPECT_FALSE (match (" a/b/c/d_e.cpp" , " ***/b/d" ));
197+ EXPECT_FALSE (match (" a/b/c/d_e.cpp" , " *****/b/d/***" ));
198+ EXPECT_FALSE (match (" a/b/c/d_e.cpp" , " ***/b/c" ));
199+ }
200+
167201} // namespace
168202} // namespace format
169203} // namespace clang
0 commit comments