https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/120852
In case those aren't compound statements. >From a2cf825d002c867804bb65e6f156a87c8da6b07d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Sat, 21 Dec 2024 20:04:44 +0100 Subject: [PATCH] [clang][bytecode] Create local scopes for if then/else statements In case those aren't compound statements. --- clang/lib/AST/ByteCode/Compiler.cpp | 27 +++++++++++++++++++++------ clang/test/AST/ByteCode/if.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 59c77f0ce78d2b..68c75b01e6f6df 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -4974,20 +4974,35 @@ template <class Emitter> bool Compiler<Emitter>::visitIfStmt(const IfStmt *IS) { LabelTy LabelEnd = this->getLabel(); if (!this->jumpFalse(LabelElse)) return false; - if (!visitStmt(IS->getThen())) - return false; + { + LocalScope<Emitter> ThenScope(this); + if (!visitStmt(IS->getThen())) + return false; + if (!ThenScope.destroyLocals()) + return false; + } if (!this->jump(LabelEnd)) return false; this->emitLabel(LabelElse); - if (!visitStmt(Else)) - return false; + { + LocalScope<Emitter> ElseScope(this); + if (!visitStmt(Else)) + return false; + if (!ElseScope.destroyLocals()) + return false; + } this->emitLabel(LabelEnd); } else { LabelTy LabelEnd = this->getLabel(); if (!this->jumpFalse(LabelEnd)) return false; - if (!visitStmt(IS->getThen())) - return false; + { + LocalScope<Emitter> ThenScope(this); + if (!visitStmt(IS->getThen())) + return false; + if (!ThenScope.destroyLocals()) + return false; + } this->emitLabel(LabelEnd); } diff --git a/clang/test/AST/ByteCode/if.cpp b/clang/test/AST/ByteCode/if.cpp index 540cb76fbaac3c..c48b2b8d378c85 100644 --- a/clang/test/AST/ByteCode/if.cpp +++ b/clang/test/AST/ByteCode/if.cpp @@ -76,3 +76,30 @@ namespace IfScope { } static_assert(foo() == 13, ""); } + +namespace IfScope2 { + struct __bit_iterator { + unsigned __ctz_; + }; + constexpr void __fill_n_bool(__bit_iterator) {} + + constexpr void fill_n(__bit_iterator __first) { + if (false) + __fill_n_bool(__first); + else + __fill_n_bool(__first); + } + + struct bitset{ + constexpr void reset() { + auto m = __bit_iterator(8); + fill_n(m); + } + }; + consteval bool foo() { + bitset v; + v.reset(); + return true; + } + static_assert(foo()); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits