[clang] [clang][AST] Invalidate DecompositionDecl if it has invalid initializer. (PR #72428)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 19 06:03:45 PST 2023
https://github.com/hokein updated https://github.com/llvm/llvm-project/pull/72428
>From f114c48948d8b56a5e04e50b7f27ce499e60bc77 Mon Sep 17 00:00:00 2001
From: Haojian Wu <hokein.wu at gmail.com>
Date: Wed, 15 Nov 2023 20:31:12 +0100
Subject: [PATCH 1/3] [clang][AST] Invalidate DecompositionDecl if it has
invalid initializer.
Fix #67495, #72198
---
clang/lib/Sema/SemaDecl.cpp | 9 +++++++++
clang/test/AST/ast-dump-invalid-initialized.cpp | 15 ++++++++++++++-
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index ffbe317d559995..0986a5f2219b01 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13573,6 +13573,15 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
CreateRecoveryExpr(Init->getBeginLoc(), Init->getEndLoc(), Args);
if (RecoveryExpr.get())
VDecl->setInit(RecoveryExpr.get());
+ // In general, for error recovery purposes, the initalizer doesn't play
+ // part in the valid bit of the declaration. There are a few exceptions:
+ // 1) if the var decl has a deduced auto type, and the type cannot be
+ // deduced by an invalid initializer;
+ // 2) if the var decl is decompsition decl with a concrete type (e.g.
+ // `int [a, b] = 1;`), and the initializer is invalid;
+ // Case 1) is already handled earlier in this function.
+ if (llvm::isa<DecompositionDecl>(VDecl)) // Case 2)
+ VDecl->setInvalidDecl();
return;
}
diff --git a/clang/test/AST/ast-dump-invalid-initialized.cpp b/clang/test/AST/ast-dump-invalid-initialized.cpp
index 1c374ae716a9db..a71a02f0f60039 100644
--- a/clang/test/AST/ast-dump-invalid-initialized.cpp
+++ b/clang/test/AST/ast-dump-invalid-initialized.cpp
@@ -24,4 +24,17 @@ void test() {
auto b4 = A(1);
// CHECK: `-VarDecl {{.*}} invalid b5 'auto'
auto b5 = A{1};
-}
\ No newline at end of file
+}
+
+void pr72198() {
+ // CHECK: DecompositionDecl {{.*}} invalid 'int'
+ int [_, b] = {0, 0};
+ [b]{};
+}
+
+int get_point();
+void pr67495() {
+ // CHECK: DecompositionDecl {{.*}} invalid 'int &'
+ auto& [x, y] = get_point();
+ [x, y] {};
+}
>From c0e2dbc23def2dc2c19ca129aa9abf6351de705e Mon Sep 17 00:00:00 2001
From: Haojian Wu <hokein.wu at gmail.com>
Date: Fri, 17 Nov 2023 10:54:33 +0100
Subject: [PATCH 2/3] Address comments.
---
clang/lib/Sema/SemaDecl.cpp | 6 +++---
clang/test/AST/ast-dump-invalid-initialized.cpp | 6 ++++--
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 0986a5f2219b01..bb4b2b1990dbdd 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13577,9 +13577,9 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
// part in the valid bit of the declaration. There are a few exceptions:
// 1) if the var decl has a deduced auto type, and the type cannot be
// deduced by an invalid initializer;
- // 2) if the var decl is decompsition decl with a concrete type (e.g.
- // `int [a, b] = 1;`), and the initializer is invalid;
- // Case 1) is already handled earlier in this function.
+ // 2) if the var decl is decompsition decl with a non-deduced type, and
+ // the initialization fails (e.g. `int [a] = {1, 2};`);
+ // Case 1) was already handled elsewhere.
if (llvm::isa<DecompositionDecl>(VDecl)) // Case 2)
VDecl->setInvalidDecl();
return;
diff --git a/clang/test/AST/ast-dump-invalid-initialized.cpp b/clang/test/AST/ast-dump-invalid-initialized.cpp
index a71a02f0f60039..7fcbc41a7be400 100644
--- a/clang/test/AST/ast-dump-invalid-initialized.cpp
+++ b/clang/test/AST/ast-dump-invalid-initialized.cpp
@@ -26,15 +26,17 @@ void test() {
auto b5 = A{1};
}
-void pr72198() {
+void GH72198() {
// CHECK: DecompositionDecl {{.*}} invalid 'int'
int [_, b] = {0, 0};
[b]{};
}
+namespace GH67495 {
int get_point();
-void pr67495() {
+void f() {
// CHECK: DecompositionDecl {{.*}} invalid 'int &'
auto& [x, y] = get_point();
[x, y] {};
}
+}
>From 7ecf5d7af270fba5cdd2d5daebd5e3449b142197 Mon Sep 17 00:00:00 2001
From: Haojian Wu <hokein.wu at gmail.com>
Date: Tue, 19 Dec 2023 10:11:50 +0100
Subject: [PATCH 3/3] Add release note.
---
clang/docs/ReleaseNotes.rst | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 39b9176865fc04..dd4377bcf7a194 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -688,7 +688,9 @@ Bug Fixes in This Version
Fixes (#69987 <https://github.com/llvm/llvm-project/issues/69987>`_)
- Fix an issue where CTAD fails for explicit type conversion.
Fixes (#64347 <https://github.com/llvm/llvm-project/issues/64347>`_)
-
+- Fix crashes when using the binding decl from an invalid structured binding.
+ Fixes (`#67495 <https://github.com/llvm/llvm-project/issues/67495>`_) and
+ (`#72198 <https://github.com/llvm/llvm-project/issues/72198>`_)
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
More information about the cfe-commits
mailing list