diff --git a/clang-tools-extra/clangd/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp --- a/clang-tools-extra/clangd/ParsedAST.cpp +++ b/clang-tools-extra/clangd/ParsedAST.cpp @@ -493,6 +493,7 @@ // We restore the original severity in the level adjuster. // FIXME: It would be better to have a real API for this, but what? for (auto ID : {diag::ext_implicit_function_decl_c99, + diag::ext_implicit_lib_function_decl, diag::ext_implicit_lib_function_decl_c99, diag::warn_implicit_function_decl}) { OverriddenSeverity.try_emplace( diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp --- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -1465,11 +1465,12 @@ TEST(IncludeFixerTest, HeaderNamedInDiag) { Annotations Test(R"cpp( $insert[[]]int main() { - [[printf]](""); // error-ok + [[printf]](""); } )cpp"); auto TU = TestTU::withCode(Test.code()); - TU.ExtraArgs = {"-xc"}; + TU.ExtraArgs = {"-xc", "-std=c99", + "-Wno-error=implicit-function-declaration"}; auto Index = buildIndexWithSymbol({}); TU.ExternalIndex = Index.get(); @@ -1482,13 +1483,22 @@ "declarations"), withFix(Fix(Test.range("insert"), "#include \n", "Include for symbol printf"))))); + + TU.ExtraArgs = {"-xc", "-std=c89"}; + EXPECT_THAT( + *TU.build().getDiagnostics(), + ElementsAre(AllOf( + Diag(Test.range(), "implicitly declaring library function 'printf' " + "with type 'int (const char *, ...)'"), + withFix(Fix(Test.range("insert"), "#include \n", + "Include for symbol printf"))))); } TEST(IncludeFixerTest, CImplicitFunctionDecl) { - Annotations Test("void x() { [[foo]](); /* error-ok */ }"); + Annotations Test("void x() { [[foo]](); }"); auto TU = TestTU::withCode(Test.code()); TU.Filename = "test.c"; - TU.ExtraArgs.push_back("-std=c99"); + TU.ExtraArgs = {"-std=c99", "-Wno-error=implicit-function-declaration"}; Symbol Sym = func("foo"); Sym.Flags |= Symbol::IndexedForCodeCompletion; @@ -1509,6 +1519,13 @@ "support implicit function declarations"), withFix(Fix(Range{}, "#include \"foo.h\"\n", "Include \"foo.h\" for symbol foo"))))); + + TU.ExtraArgs = {"-std=c89", "-Wall"}; + EXPECT_THAT(*TU.build().getDiagnostics(), + ElementsAre(AllOf( + Diag(Test.range(), "implicit declaration of function 'foo'"), + withFix(Fix(Range{}, "#include \"foo.h\"\n", + "Include \"foo.h\" for symbol foo"))))); } TEST(DiagsInHeaders, DiagInsideHeader) {