llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Haojian Wu (hokein) <details> <summary>Changes</summary> Fix #<!-- -->67495, #<!-- -->72198 CC @<!-- -->ADKaster, @<!-- -->ecnelises --- Full diff: https://github.com/llvm/llvm-project/pull/72428.diff 2 Files Affected: - (modified) clang/lib/Sema/SemaDecl.cpp (+9) - (modified) clang/test/AST/ast-dump-invalid-initialized.cpp (+14-1) ``````````diff diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 3876eb501083acb..b89031425e4b5ac 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -13540,6 +13540,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 1c374ae716a9db5..a71a02f0f60039e 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] {}; +} `````````` </details> https://github.com/llvm/llvm-project/pull/72428 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits