https://github.com/KFAFSP updated https://github.com/llvm/llvm-project/pull/179356
>From 49b905f119dba20b761d994813f99b8a4068e452 Mon Sep 17 00:00:00 2001 From: Karl Friebel <[email protected]> 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/docs/ReleaseNotes.rst | 2 ++ clang/lib/Sema/SemaType.cpp | 8 ++++++-- clang/test/FixIt/fixit.c | 9 +++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 4d886c3d55e7c..5c791b16aef2b 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -106,6 +106,8 @@ Attribute Changes in Clang Improvements to Clang's diagnostics ----------------------------------- +- Fixed the FixIt for the `implicit-int` group of diagnostics. (#GH179354) + Improvements to Clang's time-trace ---------------------------------- 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}} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
