[clang] [Clang] Fix FixIt for implicit-int diagnostics. (PR #179356)
Karl Friebel via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 3 05:20:18 PST 2026
https://github.com/KFAFSP updated https://github.com/llvm/llvm-project/pull/179356
>From 05b3467f655edc7e8c45a7d61c36b89698538836 Mon Sep 17 00:00:00 2001
From: Karl Friebel <karl.friebel at tu-dresden.de>
Date: Tue, 3 Feb 2026 00:12:32 +0100
Subject: [PATCH] [Clang] Fix FixIt for implicit-int diagnostics.
When encountering a declaration without a type
specifier, in contexts where they could reasonably
be assumed to default to int, clang emits a
diagnostic with FixIt. This FixIt does not produce
working code.
This patch updates SemaType to correctly insert
a single int type specifier per group of
declarations, and adds coverage in the FixIt
lit test suite.
Fixes #179354
---
clang/lib/Sema/SemaType.cpp | 8 ++++++--
clang/test/FixIt/fixit.c | 9 +++++++++
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 91d36f0502d85..8ca4a9093a66d 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -980,7 +980,9 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
if (S.getLangOpts().isImplicitIntRequired()) {
S.Diag(DeclLoc, diag::warn_missing_type_specifier)
<< DS.getSourceRange()
- << FixItHint::CreateInsertion(DS.getBeginLoc(), "int");
+ << FixItHint::CreateInsertion(DS.getBeginLoc(),
+ declarator.isFirstDeclarator() ? "int "
+ : "");
} else if (!DS.hasTypeSpecifier()) {
// C99 and C++ require a type specifier. For example, C99 6.7.2p2 says:
// "At least one type specifier shall be given in the declaration
@@ -1004,7 +1006,9 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
"implicit int is disabled?");
S.Diag(DeclLoc, diag::ext_missing_type_specifier)
<< DS.getSourceRange()
- << FixItHint::CreateInsertion(DS.getBeginLoc(), "int");
+ << FixItHint::CreateInsertion(
+ DS.getBeginLoc(),
+ declarator.isFirstDeclarator() ? "int " : "");
}
}
diff --git a/clang/test/FixIt/fixit.c b/clang/test/FixIt/fixit.c
index 0e86d454a0e10..3338dc98638d0 100644
--- a/clang/test/FixIt/fixit.c
+++ b/clang/test/FixIt/fixit.c
@@ -27,6 +27,15 @@ struct s s0 = { y: 5 }; // expected-warning {{GNU old-style}}
// CHECK: int array0[5] = { [3] = 3 };
int array0[5] = { [3] 3 }; // expected-warning {{GNU 'missing ='}}
+// CHECK: int imp0[4],imp1,imp2=5;
+imp0[4],imp1,imp2=5; // expected-error 3{{type specifier missing, defaults to 'int'}}
+
+// CHECK: int f2(void)
+f2(void) // expected-error {{type specifier missing, defaults to 'int'}}
+{
+ return 0;
+}
+
// CHECK: int x
// CHECK: int y
void f1(x, y) // expected-error 2{{was not declared, defaults to 'int'; ISO C99 and later do not support implicit int}}
More information about the cfe-commits
mailing list