https://github.com/anutosh491 updated https://github.com/llvm/llvm-project/pull/164597
>From 900286b55e29bf833a73abfff6bd377ae5825637 Mon Sep 17 00:00:00 2001 From: anutosh491 <[email protected]> Date: Wed, 22 Oct 2025 16:15:26 +0530 Subject: [PATCH 1/3] Fix duplicate definition error for symbols in C mode --- clang/lib/Sema/Sema.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 215ac184a5337..15c5815398094 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -1447,6 +1447,10 @@ void Sema::ActOnEndOfTranslationUnit() { if (!VD || VD->isInvalidDecl() || !Seen.insert(VD).second) continue; + if (PP.isIncrementalProcessingEnabled() && + VD->getTranslationUnitDecl() != Context.getTranslationUnitDecl()) + continue; + if (const IncompleteArrayType *ArrayT = Context.getAsIncompleteArrayType(VD->getType())) { // Set the length of the array to 1 (C99 6.9.2p5). >From 2f5efbac8196b7c6af42bc1372d3fe9fcba9b346 Mon Sep 17 00:00:00 2001 From: anutosh491 <[email protected]> Date: Wed, 22 Oct 2025 18:34:06 +0530 Subject: [PATCH 2/3] Add tests --- clang/lib/Sema/Sema.cpp | 11 +++++++---- clang/test/Interpreter/pretty-print.c | 22 ++++++++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 15c5815398094..2c81377ad78f7 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -1447,10 +1447,6 @@ void Sema::ActOnEndOfTranslationUnit() { if (!VD || VD->isInvalidDecl() || !Seen.insert(VD).second) continue; - if (PP.isIncrementalProcessingEnabled() && - VD->getTranslationUnitDecl() != Context.getTranslationUnitDecl()) - continue; - if (const IncompleteArrayType *ArrayT = Context.getAsIncompleteArrayType(VD->getType())) { // Set the length of the array to 1 (C99 6.9.2p5). @@ -1488,6 +1484,13 @@ void Sema::ActOnEndOfTranslationUnit() { Consumer.CompleteTentativeDefinition(VD); } + // In incremental mode, tentative definitions belong to the current + // partial translation unit (PTU). Once they have been completed and + // emitted to codegen, drop them to prevent re-emission in future PTUs. + if (PP.isIncrementalProcessingEnabled()) + TentativeDefinitions.erase(TentativeDefinitions.begin(ExternalSource.get()), + TentativeDefinitions.end()); + for (auto *D : ExternalDeclarations) { if (!D || D->isInvalidDecl() || D->getPreviousDecl() || !D->isUsed()) continue; diff --git a/clang/test/Interpreter/pretty-print.c b/clang/test/Interpreter/pretty-print.c index 588df70e33e84..d0712fb152107 100644 --- a/clang/test/Interpreter/pretty-print.c +++ b/clang/test/Interpreter/pretty-print.c @@ -75,9 +75,10 @@ int * ptr = (int*)0x123; ptr int * null_ptr = (int*)0; null_ptr // CHECK-NEXT: (int *) 0x0 +union U { int I; float F; } u; u.I = 12; u.I +// CHECK-NEXT: (int) 12 + // TODO: _Bool, _Complex, _Atomic, and _BitInt -// union U { int I; float F; } u; u.I = 12; u.I -// TODO-CHECK-NEXT: (int) 12 // struct S1{} s1; s1 // TODO-CHECK-NEXT: (S1 &) @0x{{[0-9a-f]+}} @@ -86,4 +87,21 @@ int * null_ptr = (int*)0; null_ptr // E.d // TODO-CHECK-NEXT: (int) 22 +// ----------------------------------------------------------------------------- +// Tentative definition handling (C99 6.9.2) +// Verify that multiple distinct tentative definitions across inputs no longer +// conflict. Each variable should emit correctly in its own incremental module. +// ----------------------------------------------------------------------------- + +int t1; +int t2; +int t3; +t1 = 1; t2 = 2; t3 = 3; +t1 + t2 + t3 +// CHECK-NEXT: (int) 6 + +// A redefinition of an existing tentative variable should still fail. +int t1; +// expected-error {{duplicate definition of symbol '_t1'}} + %quit >From 1d741230acaab74f0f7c4ee9ed79a26c2fc9f2f7 Mon Sep 17 00:00:00 2001 From: anutosh491 <[email protected]> Date: Wed, 22 Oct 2025 18:40:19 +0530 Subject: [PATCH 3/3] format --- clang/lib/Sema/Sema.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 2c81377ad78f7..8ed3df7cf17a5 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -1489,7 +1489,7 @@ void Sema::ActOnEndOfTranslationUnit() { // emitted to codegen, drop them to prevent re-emission in future PTUs. if (PP.isIncrementalProcessingEnabled()) TentativeDefinitions.erase(TentativeDefinitions.begin(ExternalSource.get()), - TentativeDefinitions.end()); + TentativeDefinitions.end()); for (auto *D : ExternalDeclarations) { if (!D || D->isInvalidDecl() || D->getPreviousDecl() || !D->isUsed()) _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
