[clangd] Fix tests for implicit C function declaration

clangd code fixes at D122983 were not right.
We need to check that clangd provides IncludeFixer fixits for implicit function declaration even if this is not an error (e.g. implicit function declaration in C89).

Reviewed By: sammccall

Differential Revision: https://reviews.llvm.org/D133043
This commit is contained in:
Aleksandr Platonov 2022-09-01 21:51:25 +03:00
parent 06c4634483
commit cc4b86cfc0
2 changed files with 22 additions and 4 deletions

View File

@ -493,6 +493,7 @@ ParsedAST::build(llvm::StringRef Filename, const ParseInputs &Inputs,
// We restore the original severity in the level adjuster. // We restore the original severity in the level adjuster.
// FIXME: It would be better to have a real API for this, but what? // FIXME: It would be better to have a real API for this, but what?
for (auto ID : {diag::ext_implicit_function_decl_c99, for (auto ID : {diag::ext_implicit_function_decl_c99,
diag::ext_implicit_lib_function_decl,
diag::ext_implicit_lib_function_decl_c99, diag::ext_implicit_lib_function_decl_c99,
diag::warn_implicit_function_decl}) { diag::warn_implicit_function_decl}) {
OverriddenSeverity.try_emplace( OverriddenSeverity.try_emplace(

View File

@ -1465,11 +1465,12 @@ TEST(IncludeFixerTest, NoCrashOnTemplateInstantiations) {
TEST(IncludeFixerTest, HeaderNamedInDiag) { TEST(IncludeFixerTest, HeaderNamedInDiag) {
Annotations Test(R"cpp( Annotations Test(R"cpp(
$insert[[]]int main() { $insert[[]]int main() {
[[printf]](""); // error-ok [[printf]]("");
} }
)cpp"); )cpp");
auto TU = TestTU::withCode(Test.code()); auto TU = TestTU::withCode(Test.code());
TU.ExtraArgs = {"-xc"}; TU.ExtraArgs = {"-xc", "-std=c99",
"-Wno-error=implicit-function-declaration"};
auto Index = buildIndexWithSymbol({}); auto Index = buildIndexWithSymbol({});
TU.ExternalIndex = Index.get(); TU.ExternalIndex = Index.get();
@ -1482,13 +1483,22 @@ TEST(IncludeFixerTest, HeaderNamedInDiag) {
"declarations"), "declarations"),
withFix(Fix(Test.range("insert"), "#include <stdio.h>\n", withFix(Fix(Test.range("insert"), "#include <stdio.h>\n",
"Include <stdio.h> for symbol printf"))))); "Include <stdio.h> 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 <stdio.h>\n",
"Include <stdio.h> for symbol printf")))));
} }
TEST(IncludeFixerTest, CImplicitFunctionDecl) { TEST(IncludeFixerTest, CImplicitFunctionDecl) {
Annotations Test("void x() { [[foo]](); /* error-ok */ }"); Annotations Test("void x() { [[foo]](); }");
auto TU = TestTU::withCode(Test.code()); auto TU = TestTU::withCode(Test.code());
TU.Filename = "test.c"; TU.Filename = "test.c";
TU.ExtraArgs.push_back("-std=c99"); TU.ExtraArgs = {"-std=c99", "-Wno-error=implicit-function-declaration"};
Symbol Sym = func("foo"); Symbol Sym = func("foo");
Sym.Flags |= Symbol::IndexedForCodeCompletion; Sym.Flags |= Symbol::IndexedForCodeCompletion;
@ -1509,6 +1519,13 @@ TEST(IncludeFixerTest, CImplicitFunctionDecl) {
"support implicit function declarations"), "support implicit function declarations"),
withFix(Fix(Range{}, "#include \"foo.h\"\n", withFix(Fix(Range{}, "#include \"foo.h\"\n",
"Include \"foo.h\" for symbol foo"))))); "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) { TEST(DiagsInHeaders, DiagInsideHeader) {