Skip to content

Commit a9006bf

Browse files
authored
[clang][bytecode] Fix zero-init of first union member (llvm#106962)
... if done via a ImplicitValueInitExpr. We were already doing this later in visitZeroRecordInitializer().
1 parent f838d6b commit a9006bf

File tree

2 files changed

+3
-6
lines changed

2 files changed

+3
-6
lines changed

clang/lib/AST/ByteCode/Compiler.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,12 +1235,6 @@ bool Compiler<Emitter>::VisitImplicitValueInitExpr(
12351235
assert(RD);
12361236
if (RD->isInvalidDecl())
12371237
return false;
1238-
if (RD->isUnion()) {
1239-
// C++11 [dcl.init]p5: If T is a (possibly cv-qualified) union type, the
1240-
// object's first non-static named data member is zero-initialized
1241-
// FIXME
1242-
return false;
1243-
}
12441238

12451239
if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD);
12461240
CXXRD && CXXRD->getNumVBases() > 0) {
@@ -3434,6 +3428,8 @@ bool Compiler<Emitter>::visitZeroRecordInitializer(const Record *R,
34343428
if (!this->emitFinishInitPop(E))
34353429
return false;
34363430

3431+
// C++11 [dcl.init]p5: If T is a (possibly cv-qualified) union type, the
3432+
// object's first non-static named data member is zero-initialized
34373433
if (R->isUnion())
34383434
break;
34393435
}

clang/test/SemaObjC/non-trivial-c-union.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -fobjc-runtime-has-weak -I %S/Inputs -verify %s
2+
// RUN: %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -fobjc-runtime-has-weak -I %S/Inputs -verify -fexperimental-new-constant-interpreter %s
23

34
#include "non-trivial-c-union.h"
45

0 commit comments

Comments
 (0)