Skip to content

[cxx-interop] Make experimental flag ImportNonPublicCxxMembers #79728

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions include/swift/Basic/Features.def
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,9 @@ EXPERIMENTAL_FEATURE(SafeInteropWrappers, false)
/// Ignore resilience errors due to C++ types.
EXPERIMENTAL_FEATURE(AssumeResilientCxxTypes, true)

/// Import inherited non-public members when importing C++ classes.
EXPERIMENTAL_FEATURE(ImportNonPublicCxxMembers, true)

// Isolated deinit
SUPPRESSIBLE_LANGUAGE_FEATURE(IsolatedDeinit, 371, "isolated deinit")

Expand Down
1 change: 1 addition & 0 deletions lib/AST/FeatureSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ static bool usesFeatureMemorySafetyAttributes(Decl *decl) {
UNINTERESTING_FEATURE(StrictMemorySafety)
UNINTERESTING_FEATURE(SafeInteropWrappers)
UNINTERESTING_FEATURE(AssumeResilientCxxTypes)
UNINTERESTING_FEATURE(ImportNonPublicCxxMembers)
UNINTERESTING_FEATURE(CoroutineAccessorsUnwindOnCallerError)
UNINTERESTING_FEATURE(CoroutineAccessorsAllocateInCallee)

Expand Down
30 changes: 15 additions & 15 deletions lib/ClangImporter/ClangImporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6189,21 +6189,6 @@ TinyPtrVector<ValueDecl *> ClangRecordMemberLookup::evaluate(
DeclName name = desc.name;
ClangInheritanceInfo inheritance = desc.inheritance;

// HACK: the inherited, synthesized, private 'pointee' property used in MSVC's
// std::optional implementation causes problems when conforming it to
// CxxOptional (see conformToCxxOptionalIfNeeded()), since it clashes with the
// public 'pointee' property synthesized from using _Mybase::operator* (where
// _Mybase is _Optional_construct_base). The root cause seems to be the
// cloned member cache's inability to manage special decls synthesized from
// operators.
if (auto *decl =
dyn_cast_or_null<clang::CXXRecordDecl>(recordDecl->getClangDecl())) {
if (decl->isInStdNamespace() && decl->getIdentifier() &&
decl->getName() == "_Optional_construct_base" &&
desc.name.getBaseName() == "pointee")
return {};
}

auto &ctx = recordDecl->getASTContext();
auto directResults = evaluateOrDefault(
ctx.evaluator,
Expand All @@ -6219,6 +6204,17 @@ TinyPtrVector<ValueDecl *> ClangRecordMemberLookup::evaluate(
recordDecl->getClangDecl())
continue;

if (!ctx.LangOpts.hasFeature(Feature::ImportNonPublicCxxMembers)) {
auto access = found->getAccess();
if ((access == clang::AS_private || access == clang::AS_protected) &&
(inheritance || !isa<clang::FieldDecl>(found)))
// 'found' is a non-public member and ImportNonPublicCxxMembers is not
// enabled. Don't import it unless it is a non-inherited field, which
// we must import because it may affect implicit conformances that
// iterate through all of a struct's fields, e.g., Sendable (#76892).
continue;
}

// Don't import constructors on foreign reference types.
if (isa<clang::CXXConstructorDecl>(found) && isa<ClassDecl>(recordDecl))
continue;
Expand Down Expand Up @@ -6271,6 +6267,10 @@ TinyPtrVector<ValueDecl *> ClangRecordMemberLookup::evaluate(
foundNameArities.insert(getArity(valueDecl));

for (auto base : cxxRecord->bases()) {
if (!ctx.LangOpts.hasFeature(Feature::ImportNonPublicCxxMembers) &&
base.getAccessSpecifier() != clang::AS_public)
continue;

clang::QualType baseType = base.getType();
if (auto spectType = dyn_cast<clang::TemplateSpecializationType>(baseType))
baseType = spectType->desugar();
Expand Down
17 changes: 17 additions & 0 deletions lib/ClangImporter/ImportDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9962,6 +9962,18 @@ void ClangImporter::Implementation::loadAllMembersOfRecordDecl(
if (!nd)
continue;

if (!swiftDecl->getASTContext().LangOpts.hasFeature(
Feature::ImportNonPublicCxxMembers)) {
auto access = nd->getAccess();
if ((access == clang::AS_private || access == clang::AS_protected) &&
(inheritance || !isa<clang::FieldDecl>(nd)))
// 'nd' is a non-public member and ImportNonPublicCxxMembers is not
// enabled. Don't import it unless it is a non-inherited field, which
// we must import because it may affect implicit conformances that
// iterate through all of a struct's fields, e.g., Sendable (#76892).
continue;
}

// Currently, we don't import unnamed bitfields.
if (isa<clang::FieldDecl>(m) &&
cast<clang::FieldDecl>(m)->isUnnamedBitField())
Expand Down Expand Up @@ -10029,6 +10041,11 @@ void ClangImporter::Implementation::loadAllMembersOfRecordDecl(
// If this is a C++ record, look through the base classes too.
if (auto cxxRecord = dyn_cast<clang::CXXRecordDecl>(clangRecord)) {
for (auto base : cxxRecord->bases()) {
if (!swiftDecl->getASTContext().LangOpts.hasFeature(
Feature::ImportNonPublicCxxMembers) &&
base.getAccessSpecifier() != clang::AS_public)
continue;

clang::QualType baseType = base.getType();
if (auto spectType = dyn_cast<clang::TemplateSpecializationType>(baseType))
baseType = spectType->desugar();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %target-swift-ide-test -print-module -print-access -module-to-print=AccessInversion -I %S/Inputs -source-filename=x -cxx-interoperability-mode=default | %FileCheck %s
// RUN: %target-swift-ide-test -print-module -print-access -module-to-print=AccessInversion -I %S/Inputs -source-filename=x -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers | %FileCheck %s
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

// CHECK: public struct Leaky {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
// but does not necessarily specify it (in the deliberate sense). In other words,
// there may be behaviors captured in these tests that deserve amending.

// RUN: %target-typecheck-verify-swift -I %S/Inputs -cxx-interoperability-mode=default
// RUN: %target-typecheck-verify-swift -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

import AccessInversion

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
// Public C++ members should be imported with Swift-public access, and
// private C++ members should be imported with Swift-private access.

// RUN: %target-swift-ide-test -print-module -module-to-print=AccessSpecifiers -print-access -I %S/Inputs -source-filename=x -enable-experimental-cxx-interop | %FileCheck %s
// RUN: %target-swift-ide-test -print-module -module-to-print=AccessSpecifiers -print-access -I %S/Inputs -source-filename=x -enable-experimental-cxx-interop -enable-experimental-feature ImportNonPublicCxxMembers | %FileCheck %s
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

// CHECK: public struct PublicPrivate {
// CHECK-NEXT: public init()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Test that C++ access specifiers are honored.

// RUN: %target-typecheck-verify-swift -verify-ignore-unknown -I %S/Inputs -enable-experimental-cxx-interop
// RUN: %target-typecheck-verify-swift -verify-ignore-unknown -I %S/Inputs -enable-experimental-cxx-interop -enable-experimental-feature ImportNonPublicCxxMembers
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

import AccessSpecifiers

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
// Test that all accessible inherited methods can be called.
//
// RUN: split-file %s %t
// RUN: %target-build-swift -module-name main %t/blessed.swift -I %S/Inputs -o %t/out -Xfrontend -cxx-interoperability-mode=default
// RUN: %target-build-swift -module-name main %t/blessed.swift -I %S/Inputs -o %t/out -Xfrontend -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers
// RUN: %target-codesign %t/out
// RUN: %target-run %t/out
//
// REQUIRES: executable_test
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

import StdlibUnittest
import NonPublicInheritance
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
// against message wording changes), but it does require the message to mention
// something about "private".
//
// RUN: %target-swift-ide-test -print-module -module-to-print=NonPublicInheritance -print-access -I %S/Inputs -source-filename=x -enable-experimental-cxx-interop | %FileCheck %s
// RUN: %target-swift-ide-test -print-module -module-to-print=NonPublicInheritance -print-access -I %S/Inputs -source-filename=x -enable-experimental-cxx-interop -enable-experimental-feature ImportNonPublicCxxMembers | %FileCheck %s
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

// CHECK: public struct Base {
// CHECK-NEXT: public init()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//--- blessed.swift
// RUN: split-file %s %t
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/blessed.swift

// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/blessed.swift -enable-experimental-feature ImportNonPublicCxxMembers
// REQUIRES: swift_feature_ImportNonPublicCxxMembers
import NonPublicInheritance

// Extensions of each class test whether we correctly modeled *which* members
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
// Check that we are resolving the correct member for all unambiguous members
// in the Shadow struct.

// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -cxx-interoperability-mode=default)
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers)
// REQUIRES: executable_test
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

import StdlibUnittest
import NonPublicShadow
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %target-swift-ide-test -print-module -module-to-print=NonPublicShadow -print-access -I %S/Inputs -source-filename=x -cxx-interoperability-mode=default | %FileCheck %s
// RUN: %target-swift-ide-test -print-module -module-to-print=NonPublicShadow -print-access -I %S/Inputs -source-filename=x -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers | %FileCheck %s
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

// We only check the module interface of Shadow to keep this test concise

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default %s
// RUN: %target-swift-frontend %s -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers
// REQUIRES: swift_feature_ImportNonPublicCxxMembers
import NonPublicShadow

func f(s: Shadow) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// RUN: split-file %s %t
// RUN: %target-swift-frontend -typecheck -verify %t/some/subdir/file1.swift -verify-additional-file %t/Cxx/include/cxx-header.h -I %t/Cxx/include -cxx-interoperability-mode=default -module-name main -suppress-remarks
// RUN: %target-swift-frontend -typecheck -verify -suppress-remarks %t/some/subdir/file1.swift -verify-additional-file %t/Cxx/include/cxx-header.h -I %t/Cxx/include -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

// This test uses -verify-additional-file, which do not work well on Windows:
// UNSUPPORTED: OS=windows-msvc
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
// works as expected.
//
// RUN: split-file %s %t
// RUN: %target-swift-frontend -typecheck -verify %t/file1.swift -I %t/include -cxx-interoperability-mode=default -module-name main
// RUN: %target-swift-frontend -typecheck -verify %t/file2.swift -I %t/include -cxx-interoperability-mode=default -module-name main
// RUN: %target-swift-frontend -typecheck -verify %t/file1.swift -I %t/include -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main
// RUN: %target-swift-frontend -typecheck -verify %t/file2.swift -I %t/include -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

//--- include/module.modulemap
module CxxModule {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
// non-public in different contexts, and variations in module and file names.
//
// RUN: split-file %s %t
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/blessed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/blessed.swift
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

//--- blessed.swift

Expand Down
35 changes: 19 additions & 16 deletions test/Interop/Cxx/class/access/private-fileid-typecheck.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
// in the contexts where they should be accessible (i.e., the files blessed by
// the SWIFT_PRIVATE_FILEID annotation).
//
// For now, it requires the following feature to import private members:
// REQUIRES: swift_feature_ImportNonPublicCxxMembers
//
// The private_fileid mechanism relies on fileIDs, so we need some control over
// file names:
//
Expand All @@ -16,37 +19,37 @@
// members are private (default) or protected. The result should be the same
// no matter the configuration.
//
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/blessed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/blessed.swift -Xcc -DTEST_CLASS=struct
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/blessed.swift -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/blessed.swift -Xcc -DTEST_CLASS=struct -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/blessed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/blessed.swift -Xcc -DTEST_CLASS=struct
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/blessed.swift -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/blessed.swift -Xcc -DTEST_CLASS=struct -Xcc -DTEST_PRIVATE=protected
//
// This test also includes a "cursed.swift", which expects to not have access to
// non-public members:
//
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/cursed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/cursed.swift -Xcc -DTEST_CLASS=struct
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/cursed.swift -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/cursed.swift -Xcc -DTEST_CLASS=struct -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/cursed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/cursed.swift -Xcc -DTEST_CLASS=struct
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/cursed.swift -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/cursed.swift -Xcc -DTEST_CLASS=struct -Xcc -DTEST_PRIVATE=protected
//
// To check that fileID is agnostic about directory structure within a module,
// we move blessed.swift into a subdirectory (but keep its filename).
//
// RUN: mkdir -p %t/subdir/subsubdir
// RUN: mv %t/blessed.swift %t/subdir/subsubdir/blessed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/subdir/subsubdir/blessed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/subdir/subsubdir/blessed.swift -Xcc -DTEST_CLASS=struct
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/subdir/subsubdir/blessed.swift -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name main %t/subdir/subsubdir/blessed.swift -Xcc -DTEST_CLASS=struct -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/subdir/subsubdir/blessed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/subdir/subsubdir/blessed.swift -Xcc -DTEST_CLASS=struct
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/subdir/subsubdir/blessed.swift -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name main %t/subdir/subsubdir/blessed.swift -Xcc -DTEST_CLASS=struct -Xcc -DTEST_PRIVATE=protected
//
// To check that fileID is sensitive to module names, rename cursed.swift to
// "blessed.swift", but typecheck in a module not called "main".
//
// RUN: mv %t/cursed.swift %t/blessed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name brain %t/blessed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name brain %t/blessed.swift -Xcc -DTEST_CLASS=struct
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name brain %t/blessed.swift -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -module-name brain %t/blessed.swift -Xcc -DTEST_CLASS=struct -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name brain %t/blessed.swift
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name brain %t/blessed.swift -Xcc -DTEST_CLASS=struct
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name brain %t/blessed.swift -Xcc -DTEST_PRIVATE=protected
// RUN: %target-swift-frontend -typecheck -verify -I %S/Inputs -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers -module-name brain %t/blessed.swift -Xcc -DTEST_CLASS=struct -Xcc -DTEST_PRIVATE=protected

//--- blessed.swift

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -cxx-interoperability-mode=default)
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers)
// REQUIRES: executable_test
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

import StdlibUnittest
import UsingNonPublic
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// RUN: %target-swift-ide-test -print-module -module-to-print=UsingNonPublic -print-access -I %S/Inputs -source-filename=x -cxx-interoperability-mode=default | %FileCheck %s
// RUN: %target-swift-ide-test -print-module -module-to-print=UsingNonPublic -print-access -I %S/Inputs -source-filename=x -cxx-interoperability-mode=default -enable-experimental-feature ImportNonPublicCxxMembers | %FileCheck %s
// REQUIRES: swift_feature_ImportNonPublicCxxMembers

// CHECK: public struct PublUser {
// CHECK-NEXT: public init()
Expand Down
Loading