Skip to content

Commit 91c1b55

Browse files
committed
[Type checker] Make sure that validating a class requests member layout.
This ensures that we can compute the vtable of such classes without triggering the type checker. Fixes rdar://problem/42394591.
1 parent fe8263e commit 91c1b55

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2868,8 +2868,9 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
28682868
DescriptiveDeclKind::Class, path);
28692869
}
28702870

2871-
for (Decl *Member : CD->getMembers())
2871+
for (Decl *Member : CD->getMembers()) {
28722872
visit(Member);
2873+
}
28732874

28742875
// If this class requires all of its stored properties to have
28752876
// in-class initializers, diagnose this now.
@@ -2978,6 +2979,11 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
29782979

29792980
TC.checkDeclCircularity(CD);
29802981
TC.ConformanceContexts.push_back(CD);
2982+
2983+
for (auto Member : CD->getMembers()) {
2984+
if (auto VD = dyn_cast<ValueDecl>(Member))
2985+
TC.requestMemberLayout(VD);
2986+
}
29812987
}
29822988

29832989
void visitProtocolDecl(ProtocolDecl *PD) {
@@ -5528,6 +5534,9 @@ void TypeChecker::addImplicitConstructors(NominalTypeDecl *decl) {
55285534
*this, classDecl, superclassCtor, kind)) {
55295535
Context.addSynthesizedDecl(ctor);
55305536
classDecl->addMember(ctor);
5537+
5538+
if (classDecl->hasValidatedLayout())
5539+
requestMemberLayout(ctor);
55315540
}
55325541
}
55335542

0 commit comments

Comments
 (0)