[clang] [clang] Preserve the initializer when variable declaration deduction fails (PR #173546)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 25 03:32:29 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Haojian Wu (hokein)
<details>
<summary>Changes</summary>
Fix https://github.com/clangd/clangd/issues/2572.
---
Full diff: https://github.com/llvm/llvm-project/pull/173546.diff
2 Files Affected:
- (modified) clang/lib/Sema/SemaDecl.cpp (+8-1)
- (modified) clang/test/AST/ast-dump-recovery.cpp (+8)
``````````diff
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1a5e8c607a242..2cbb7b9fd3e17 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13839,8 +13839,15 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
return;
}
- if (DeduceVariableDeclarationType(VDecl, DirectInit, Init))
+ if (DeduceVariableDeclarationType(VDecl, DirectInit, Init)) {
+ assert(VDecl->isInvalidDecl() &&
+ "decl should be invalidated when deduce fails");
+ if (auto *RecoveryExpr =
+ CreateRecoveryExpr(Init->getBeginLoc(), Init->getEndLoc(), {Init})
+ .get())
+ VDecl->setInit(RecoveryExpr);
return;
+ }
}
this->CheckAttributesOnDeducedType(RealDecl);
diff --git a/clang/test/AST/ast-dump-recovery.cpp b/clang/test/AST/ast-dump-recovery.cpp
index 060ae3b62b6f8..80ec0a449d556 100644
--- a/clang/test/AST/ast-dump-recovery.cpp
+++ b/clang/test/AST/ast-dump-recovery.cpp
@@ -301,3 +301,11 @@ void foo() {
U g{};
}
} // namespace GH112560
+
+// CHECK: VarDecl {{.*}} invalid x 'auto *' cinit
+// CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>' contains-errors lvalue
+// CHECK-NEXT: `-CallExpr {{.*}} 'int'
+// DISABLED-NOT: -RecoveryExpr {{.*}} contains-errors
+void brokenDeducedVarDecl() {
+ auto* x = some_func(nullptr);
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/173546
More information about the cfe-commits
mailing list