Skip to content

Commit 435375d

Browse files
authored
Merge pull request #16798 from aschwaighofer/opaque_existentials_bitwise_takable
2 parents 66628f6 + 98506e0 commit 435375d

File tree

5 files changed

+14
-6
lines changed

5 files changed

+14
-6
lines changed

lib/IRGen/GenExistential.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ class OpaqueExistentialTypeInfo final :
280280
llvm::Type *ty, Size size, Alignment align)
281281
: super(protocols, ty, size,
282282
SpareBitVector::getConstant(size.getValueInBits(), false), align,
283-
IsNotPOD, IsNotBitwiseTakable, IsFixedSize) {}
283+
IsNotPOD, IsBitwiseTakable, IsFixedSize) {}
284284

285285
public:
286286
OpaqueExistentialLayout getLayout() const {

stdlib/public/runtime/ExistentialMetadataImpl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ struct LLVM_LIBRARY_VISIBILITY OpaqueExistentialBox
327327
static constexpr size_t alignment = alignof(Container);
328328
static constexpr size_t stride = sizeof(Container);
329329
static constexpr size_t isPOD = false;
330-
static constexpr bool isBitwiseTakable = false;
330+
static constexpr bool isBitwiseTakable = true;
331331
static constexpr unsigned numExtraInhabitants = 0;
332332
};
333333

stdlib/public/runtime/Metadata.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2526,7 +2526,7 @@ OpaqueExistentialValueWitnessTableCacheEntry(unsigned numWitnessTables) {
25262526
Data.flags = ValueWitnessFlags()
25272527
.withAlignment(Box::Container::getAlignment(numWitnessTables))
25282528
.withPOD(false)
2529-
.withBitwiseTakable(false)
2529+
.withBitwiseTakable(true)
25302530
.withInlineStorage(false)
25312531
.withExtraInhabitants(false);
25322532
Data.stride = Box::Container::getStride(numWitnessTables);

test/IRGen/existentials.sil

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@
55
sil_stage canonical
66

77
import Swift
8+
protocol P {}
9+
10+
// NonBitwiseTakableBit = 0x00100000. This struct is bitwise takable because
11+
// 0x30007 = 196615.
12+
// CHECK: @"$S12existentials14BitwiseTakableVWV" = internal constant [11 x i8*] {{.*}} i8* inttoptr (i64 196615 to i8*)
13+
struct BitwiseTakable {
14+
var p: P
15+
}
816

917
protocol CP: class {}
1018

unittests/runtime/Metadata.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ TEST(MetadataTest, getExistentialTypeMetadata_opaque) {
507507
EXPECT_EQ(5 * sizeof(void*), ex1->getValueWitnesses()->getSize());
508508
EXPECT_EQ(alignof(void*), ex1->getValueWitnesses()->getAlignment());
509509
EXPECT_FALSE(ex1->getValueWitnesses()->isPOD());
510-
EXPECT_FALSE(ex1->getValueWitnesses()->isBitwiseTakable());
510+
EXPECT_TRUE(ex1->getValueWitnesses()->isBitwiseTakable());
511511
EXPECT_EQ(nullptr,
512512
ex1->getSuperclassConstraint());
513513
return ex1;
@@ -525,7 +525,7 @@ TEST(MetadataTest, getExistentialTypeMetadata_opaque) {
525525
EXPECT_EQ(6 * sizeof(void*), ex2->getValueWitnesses()->getSize());
526526
EXPECT_EQ(alignof(void*), ex2->getValueWitnesses()->getAlignment());
527527
EXPECT_FALSE(ex2->getValueWitnesses()->isPOD());
528-
EXPECT_FALSE(ex2->getValueWitnesses()->isBitwiseTakable());
528+
EXPECT_TRUE(ex2->getValueWitnesses()->isBitwiseTakable());
529529
EXPECT_EQ(nullptr,
530530
ex2->getSuperclassConstraint());
531531
return ex2;
@@ -543,7 +543,7 @@ TEST(MetadataTest, getExistentialTypeMetadata_opaque) {
543543
EXPECT_EQ(7 * sizeof(void*), ex3->getValueWitnesses()->getSize());
544544
EXPECT_EQ(alignof(void*), ex3->getValueWitnesses()->getAlignment());
545545
EXPECT_FALSE(ex3->getValueWitnesses()->isPOD());
546-
EXPECT_FALSE(ex3->getValueWitnesses()->isBitwiseTakable());
546+
EXPECT_TRUE(ex3->getValueWitnesses()->isBitwiseTakable());
547547
EXPECT_EQ(nullptr,
548548
ex3->getSuperclassConstraint());
549549
return ex3;

0 commit comments

Comments
 (0)