@@ -402,6 +402,8 @@ TEST(MetadataTest, getExistentialMetadata) {
402
402
EXPECT_EQ (0U , any->Protocols .NumProtocols );
403
403
EXPECT_EQ (SpecialProtocol::None,
404
404
any->Flags .getSpecialProtocol ());
405
+ EXPECT_EQ (nullptr ,
406
+ any->getSuperclassConstraint ());
405
407
return any;
406
408
});
407
409
@@ -420,6 +422,8 @@ TEST(MetadataTest, getExistentialMetadata) {
420
422
EXPECT_EQ (&ProtocolA, a->Protocols [0 ]);
421
423
EXPECT_EQ (SpecialProtocol::None,
422
424
a->Flags .getSpecialProtocol ());
425
+ EXPECT_EQ (nullptr ,
426
+ a->getSuperclassConstraint ());
423
427
return a;
424
428
});
425
429
@@ -439,6 +443,8 @@ TEST(MetadataTest, getExistentialMetadata) {
439
443
EXPECT_EQ (&ProtocolB, b->Protocols [0 ]);
440
444
EXPECT_EQ (SpecialProtocol::None,
441
445
b->Flags .getSpecialProtocol ());
446
+ EXPECT_EQ (nullptr ,
447
+ b->getSuperclassConstraint ());
442
448
return b;
443
449
});
444
450
@@ -472,8 +478,8 @@ TEST(MetadataTest, getExistentialMetadata) {
472
478
|| (ab->Protocols [0 ]==&ProtocolB && ab->Protocols [1 ]==&ProtocolA));
473
479
EXPECT_EQ (SpecialProtocol::None,
474
480
ab->Flags .getSpecialProtocol ());
475
- EXPECT_EQ (SpecialProtocol::None ,
476
- ba-> Flags . getSpecialProtocol ());
481
+ EXPECT_EQ (nullptr ,
482
+ ab-> getSuperclassConstraint ());
477
483
return ab;
478
484
});
479
485
@@ -494,6 +500,8 @@ TEST(MetadataTest, getExistentialMetadata) {
494
500
EXPECT_EQ (SpecialProtocol::None,
495
501
classConstrained->Flags .getSpecialProtocol ());
496
502
EXPECT_EQ (&ProtocolClassConstrained, classConstrained->Protocols [0 ]);
503
+ EXPECT_EQ (nullptr ,
504
+ classConstrained->getSuperclassConstraint ());
497
505
return classConstrained;
498
506
});
499
507
@@ -514,6 +522,8 @@ TEST(MetadataTest, getExistentialMetadata) {
514
522
EXPECT_EQ (SpecialProtocol::None,
515
523
noWitnessTable->Flags .getSpecialProtocol ());
516
524
EXPECT_EQ (&ProtocolNoWitnessTable, noWitnessTable->Protocols [0 ]);
525
+ EXPECT_EQ (nullptr ,
526
+ noWitnessTable->getSuperclassConstraint ());
517
527
return noWitnessTable;
518
528
});
519
529
@@ -536,6 +546,8 @@ TEST(MetadataTest, getExistentialMetadata) {
536
546
EXPECT_EQ (3U , mixedWitnessTable->Protocols .NumProtocols );
537
547
EXPECT_EQ (SpecialProtocol::None,
538
548
mixedWitnessTable->Flags .getSpecialProtocol ());
549
+ EXPECT_EQ (nullptr ,
550
+ mixedWitnessTable->getSuperclassConstraint ());
539
551
return mixedWitnessTable;
540
552
});
541
553
@@ -561,6 +573,8 @@ TEST(MetadataTest, getExistentialMetadata) {
561
573
special->Flags .getSpecialProtocol ());
562
574
EXPECT_EQ (ExpectedErrorValueWitnesses,
563
575
special->getValueWitnesses ());
576
+ EXPECT_EQ (nullptr ,
577
+ special->getSuperclassConstraint ());
564
578
return special;
565
579
});
566
580
@@ -582,6 +596,8 @@ TEST(MetadataTest, getExistentialMetadata) {
582
596
special->Flags .getSpecialProtocol ());
583
597
EXPECT_NE (ExpectedErrorValueWitnesses,
584
598
special->getValueWitnesses ());
599
+ EXPECT_EQ (nullptr ,
600
+ special->getSuperclassConstraint ());
585
601
return special;
586
602
});
587
603
}
@@ -710,6 +726,8 @@ TEST(MetadataTest, getExistentialTypeMetadata_opaque) {
710
726
EXPECT_EQ (alignof (void *), ex1->getValueWitnesses ()->getAlignment ());
711
727
EXPECT_FALSE (ex1->getValueWitnesses ()->isPOD ());
712
728
EXPECT_FALSE (ex1->getValueWitnesses ()->isBitwiseTakable ());
729
+ EXPECT_EQ (nullptr ,
730
+ ex1->getSuperclassConstraint ());
713
731
return ex1;
714
732
});
715
733
@@ -726,6 +744,8 @@ TEST(MetadataTest, getExistentialTypeMetadata_opaque) {
726
744
EXPECT_EQ (alignof (void *), ex2->getValueWitnesses ()->getAlignment ());
727
745
EXPECT_FALSE (ex2->getValueWitnesses ()->isPOD ());
728
746
EXPECT_FALSE (ex2->getValueWitnesses ()->isBitwiseTakable ());
747
+ EXPECT_EQ (nullptr ,
748
+ ex2->getSuperclassConstraint ());
729
749
return ex2;
730
750
});
731
751
@@ -742,6 +762,8 @@ TEST(MetadataTest, getExistentialTypeMetadata_opaque) {
742
762
EXPECT_EQ (alignof (void *), ex3->getValueWitnesses ()->getAlignment ());
743
763
EXPECT_FALSE (ex3->getValueWitnesses ()->isPOD ());
744
764
EXPECT_FALSE (ex3->getValueWitnesses ()->isBitwiseTakable ());
765
+ EXPECT_EQ (nullptr ,
766
+ ex3->getSuperclassConstraint ());
745
767
return ex3;
746
768
});
747
769
}
@@ -760,6 +782,8 @@ TEST(MetadataTest, getExistentialTypeMetadata_class) {
760
782
EXPECT_EQ (alignof (void *), ex1->getValueWitnesses ()->getAlignment ());
761
783
EXPECT_FALSE (ex1->getValueWitnesses ()->isPOD ());
762
784
EXPECT_TRUE (ex1->getValueWitnesses ()->isBitwiseTakable ());
785
+ EXPECT_EQ (nullptr ,
786
+ ex1->getSuperclassConstraint ());
763
787
return ex1;
764
788
});
765
789
@@ -776,6 +800,8 @@ TEST(MetadataTest, getExistentialTypeMetadata_class) {
776
800
EXPECT_EQ (alignof (void *), ex2->getValueWitnesses ()->getAlignment ());
777
801
EXPECT_FALSE (ex2->getValueWitnesses ()->isPOD ());
778
802
EXPECT_TRUE (ex2->getValueWitnesses ()->isBitwiseTakable ());
803
+ EXPECT_EQ (nullptr ,
804
+ ex2->getSuperclassConstraint ());
779
805
return ex2;
780
806
});
781
807
@@ -792,10 +818,61 @@ TEST(MetadataTest, getExistentialTypeMetadata_class) {
792
818
EXPECT_EQ (alignof (void *), ex3->getValueWitnesses ()->getAlignment ());
793
819
EXPECT_FALSE (ex3->getValueWitnesses ()->isPOD ());
794
820
EXPECT_TRUE (ex3->getValueWitnesses ()->isBitwiseTakable ());
821
+ EXPECT_EQ (nullptr ,
822
+ ex3->getSuperclassConstraint ());
795
823
return ex3;
796
824
});
797
825
}
798
826
827
+ TEST (MetadataTest, getExistentialTypeMetadata_subclass) {
828
+ RaceTest_ExpectEqual<const ExistentialTypeMetadata *>(
829
+ [&]() -> const ExistentialTypeMetadata * {
830
+ const ProtocolDescriptor *protoList1[] = {
831
+ &OpaqueProto1
832
+ };
833
+ auto ex1 = swift_getExistentialTypeMetadata (ProtocolClassConstraint::Class,
834
+ /* superclass=*/ &MetadataTest2,
835
+ 1 , protoList1);
836
+ EXPECT_EQ (MetadataKind::Existential, ex1->getKind ());
837
+ EXPECT_EQ (2 * sizeof (void *), ex1->getValueWitnesses ()->getSize ());
838
+ EXPECT_EQ (alignof (void *), ex1->getValueWitnesses ()->getAlignment ());
839
+ EXPECT_FALSE (ex1->getValueWitnesses ()->isPOD ());
840
+ EXPECT_TRUE (ex1->getValueWitnesses ()->isBitwiseTakable ());
841
+ EXPECT_EQ (ProtocolClassConstraint::Class,
842
+ ex1->Flags .getClassConstraint ());
843
+ EXPECT_EQ (1U , ex1->Protocols .NumProtocols );
844
+ EXPECT_EQ (&OpaqueProto1, ex1->Protocols [0 ]);
845
+ EXPECT_EQ (&MetadataTest2, ex1->getSuperclassConstraint ());
846
+ return ex1;
847
+ });
848
+
849
+
850
+ RaceTest_ExpectEqual<const ExistentialTypeMetadata *>(
851
+ [&]() -> const ExistentialTypeMetadata * {
852
+ const ProtocolDescriptor *protoList2[] = {
853
+ &OpaqueProto1,
854
+ &ClassProto1
855
+ };
856
+ auto ex2 = swift_getExistentialTypeMetadata (ProtocolClassConstraint::Class,
857
+ /* superclass=*/ &MetadataTest2,
858
+ 2 , protoList2);
859
+ EXPECT_EQ (MetadataKind::Existential, ex2->getKind ());
860
+ EXPECT_EQ (3 * sizeof (void *), ex2->getValueWitnesses ()->getSize ());
861
+ EXPECT_EQ (alignof (void *), ex2->getValueWitnesses ()->getAlignment ());
862
+ EXPECT_FALSE (ex2->getValueWitnesses ()->isPOD ());
863
+ EXPECT_TRUE (ex2->getValueWitnesses ()->isBitwiseTakable ());
864
+ EXPECT_EQ (ProtocolClassConstraint::Class,
865
+ ex2->Flags .getClassConstraint ());
866
+ EXPECT_EQ (2U , ex2->Protocols .NumProtocols );
867
+ EXPECT_TRUE ((ex2->Protocols [0 ] == &OpaqueProto1 &&
868
+ ex2->Protocols [1 ] == &ClassProto1) ||
869
+ (ex2->Protocols [0 ] == &ClassProto1 &&
870
+ ex2->Protocols [1 ] == &OpaqueProto1));
871
+ EXPECT_EQ (&MetadataTest2, ex2->getSuperclassConstraint ());
872
+ return ex2;
873
+ });
874
+ }
875
+
799
876
static const void *AllocatedBuffer = nullptr ;
800
877
static const void *DeallocatedBuffer = nullptr ;
801
878
0 commit comments