aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clang/lib/AST/ByteCode/Compiler.cpp7
-rw-r--r--clang/lib/AST/ByteCode/Compiler.h2
-rw-r--r--clang/test/AST/ByteCode/unions.cpp14
3 files changed, 19 insertions, 4 deletions
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index f23472f..c140837 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 ecf5066..0a93c46 100644
--- a/clang/lib/AST/ByteCode/Compiler.h
+++ b/clang/lib/AST/ByteCode/Compiler.h
@@ -383,7 +383,7 @@ private:
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 0a1f0f8..b1fbb0c 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