diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index f23472f99ac1b..c1408379b4c1b 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -5665,7 +5665,7 @@ bool Compiler::compileDestructor(const CXXDestructorDecl *Dtor) { } template -bool Compiler::compileUnionCopyAssignmentOperator( +bool Compiler::compileUnionAssignmentOperator( const CXXMethodDecl *MD) { if (!this->emitThis(MD)) return false; @@ -5693,8 +5693,9 @@ bool Compiler::visitFunc(const FunctionDecl *F) { if (const auto *MD = dyn_cast(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 ecf50662d617b..0a93c46a40ef5 100644 --- a/clang/lib/AST/ByteCode/Compiler.h +++ b/clang/lib/AST/ByteCode/Compiler.h @@ -383,7 +383,7 @@ class Compiler : public ConstStmtVisitor, 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 0a1f0f88650f2..b1fbb0c4dfc06 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