[clang] acb7dfa - [clang][bytecode] Create local scopes for if then/else statements (#120852)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Dec 21 23:04:53 PST 2024
Author: Timm Baeder
Date: 2024-12-22T08:04:49+01:00
New Revision: acb7dfaa017dc11106bf97de4e8bf72d47ff54a8
URL: https://github.com/llvm/llvm-project/commit/acb7dfaa017dc11106bf97de4e8bf72d47ff54a8
DIFF: https://github.com/llvm/llvm-project/commit/acb7dfaa017dc11106bf97de4e8bf72d47ff54a8.diff
LOG: [clang][bytecode] Create local scopes for if then/else statements (#120852)
In case those aren't compound statements.
Added:
Modified:
clang/lib/AST/ByteCode/Compiler.cpp
clang/test/AST/ByteCode/if.cpp
Removed:
################################################################################
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());
+}
More information about the cfe-commits
mailing list