https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/125516
None >From c5932a0673b96eb250aa7740dc54f2985a700359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Mon, 3 Feb 2025 16:17:35 +0100 Subject: [PATCH] [clang][bytecode] Handle union move assignment operators as well --- clang/lib/AST/ByteCode/Compiler.cpp | 7 ++++--- clang/lib/AST/ByteCode/Compiler.h | 2 +- clang/test/AST/ByteCode/unions.cpp | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index f23472f99ac1b5..c1408379b4c1b8 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -5665,7 +5665,7 @@ bool Compiler<Emitter>::compileDestructor(const CXXDestructorDecl *Dtor) { } template <class Emitter> -bool Compiler<Emitter>::compileUnionCopyAssignmentOperator( +bool Compiler<Emitter>::compileUnionAssignmentOperator( const CXXMethodDecl *MD) { if (!this->emitThis(MD)) return false; @@ -5693,8 +5693,9 @@ bool Compiler<Emitter>::visitFunc(const FunctionDecl *F) { if (const auto *MD = dyn_cast<CXXMethodDecl>(F)) { const RecordDecl *RD = MD->getParent(); - if (RD->isUnion() && MD->isCopyAssignmentOperator()) - return this->compileUnionCopyAssignmentOperator(MD); + if (RD->isUnion() && + (MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return this->compileUnionAssignmentOperator(MD); if (MD->isLambdaStaticInvoker()) return this->emitLambdaStaticInvokerBody(MD); diff --git a/clang/lib/AST/ByteCode/Compiler.h b/clang/lib/AST/ByteCode/Compiler.h index ecf50662d617bc..0a93c46a40ef5f 100644 --- a/clang/lib/AST/ByteCode/Compiler.h +++ b/clang/lib/AST/ByteCode/Compiler.h @@ -383,7 +383,7 @@ class Compiler : public ConstStmtVisitor<Compiler<Emitter>, bool>, bool emitBuiltinBitCast(const CastExpr *E); bool compileConstructor(const CXXConstructorDecl *Ctor); bool compileDestructor(const CXXDestructorDecl *Dtor); - bool compileUnionCopyAssignmentOperator(const CXXMethodDecl *MD); + bool compileUnionAssignmentOperator(const CXXMethodDecl *MD); bool checkLiteralType(const Expr *E); diff --git a/clang/test/AST/ByteCode/unions.cpp b/clang/test/AST/ByteCode/unions.cpp index 0a1f0f88650f27..b1fbb0c4dfc06a 100644 --- a/clang/test/AST/ByteCode/unions.cpp +++ b/clang/test/AST/ByteCode/unions.cpp @@ -447,6 +447,20 @@ namespace CopyAssign { } static_assert(f2() == 12); // both-error {{not an integral constant expression}} \ // both-note {{in call to}} +} + +namespace MoveAssign { + union A { + int a; + int b; + }; + constexpr int f() { + A b{13}; + + b = A{12} ; + return b.a; + } + static_assert(f()== 12); } #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits