Skip to content

Commit f095990

Browse files
authored
Merge pull request #84816 from Xazax-hun/reverse-interop-non-public
[cxx-interop] Add flag to set minimum access level for reverse interop
2 parents 3266b5f + adca01b commit f095990

File tree

11 files changed

+201
-23
lines changed

11 files changed

+201
-23
lines changed

include/swift/AST/DiagnosticsFrontend.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,11 @@ ERROR(package_cmo_requires_library_evolution, none,
612612
WARNING(internal_bridging_header_without_library_evolution,none,
613613
"using internal bridging headers without library evolution can cause instability", ())
614614

615+
ERROR(error_invalid_clang_header_access_level, none,
616+
"invalid minimum clang header access level '%0'; chose from "
617+
"'public'|'package'|'internal'",
618+
(StringRef))
619+
615620
ERROR(experimental_not_supported_in_production,none,
616621
"experimental feature '%0' cannot be enabled in production compiler",
617622
(StringRef))

include/swift/Frontend/FrontendOptions.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#ifndef SWIFT_FRONTEND_FRONTENDOPTIONS_H
1414
#define SWIFT_FRONTEND_FRONTENDOPTIONS_H
1515

16+
#include "swift/AST/AttrKind.h"
1617
#include "swift/Basic/FileTypes.h"
1718
#include "swift/Basic/PathRemapper.h"
1819
#include "swift/Basic/Version.h"
@@ -501,6 +502,10 @@ class FrontendOptions {
501502
/// header.
502503
std::optional<ClangHeaderExposeBehavior> ClangHeaderExposedDecls;
503504

505+
// Include declarations that are at least as visible as the acces specified
506+
// by -emit-clang-header-min-access
507+
std::optional<AccessLevel> ClangHeaderMinAccess;
508+
504509
struct ClangHeaderExposedImportedModule {
505510
std::string moduleName;
506511
std::string headerName;

include/swift/Option/Options.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,11 @@ def emit_clang_header_path : Separate<["-"], "emit-clang-header-path">,
815815
HelpText<"Emit an Objective-C and C++ header file to <path>">,
816816
Alias<emit_objc_header_path>;
817817

818+
def emit_clang_header_min_access : Separate<["-"], "emit-clang-header-min-access">,
819+
Flags<[FrontendOption, NoInteractiveOption, ArgumentIsPath, CacheInvariant]>,
820+
MetaVarName<"<access-level>">,
821+
HelpText<"The minimum access level of declarations to include in the emitted header.>">;
822+
818823
def static : Flag<["-"], "static">,
819824
Flags<[FrontendOption, ModuleInterfaceOption, NoInteractiveOption]>,
820825
HelpText<"Make this module statically linkable and make the output of -emit-library a static library.">;

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
#include "ArgsToFrontendInputsConverter.h"
1616
#include "ArgsToFrontendOutputsConverter.h"
17-
#include "clang/Driver/Driver.h"
17+
#include "swift/AST/AttrKind.h"
1818
#include "swift/AST/DiagnosticsFrontend.h"
1919
#include "swift/Basic/Assertions.h"
2020
#include "swift/Basic/Platform.h"
@@ -24,18 +24,19 @@
2424
#include "swift/Parse/Lexer.h"
2525
#include "swift/Parse/ParseVersion.h"
2626
#include "swift/Strings.h"
27+
#include "clang/Driver/Driver.h"
2728
#include "llvm/ADT/STLExtras.h"
28-
#include "llvm/TargetParser/Triple.h"
2929
#include "llvm/CAS/ObjectStore.h"
3030
#include "llvm/Option/Arg.h"
3131
#include "llvm/Option/ArgList.h"
3232
#include "llvm/Option/Option.h"
3333
#include "llvm/Support/Compression.h"
34-
#include "llvm/Support/PrefixMapper.h"
35-
#include "llvm/Support/Process.h"
3634
#include "llvm/Support/FileSystem.h"
3735
#include "llvm/Support/LineIterator.h"
3836
#include "llvm/Support/Path.h"
37+
#include "llvm/Support/PrefixMapper.h"
38+
#include "llvm/Support/Process.h"
39+
#include "llvm/TargetParser/Triple.h"
3940

4041
using namespace swift;
4142
using namespace llvm::opt;
@@ -400,6 +401,17 @@ bool ArgsToFrontendOptionsConverter::convert(
400401
HasExposeAttrOrImplicitDeps)
401402
.Default(std::nullopt);
402403
}
404+
if (const Arg *A = Args.getLastArg(OPT_emit_clang_header_min_access)) {
405+
Opts.ClangHeaderMinAccess =
406+
llvm::StringSwitch<std::optional<AccessLevel>>(A->getValue())
407+
.Case("public", AccessLevel::Public)
408+
.Case("package", AccessLevel::Package)
409+
.Case("internal", AccessLevel::Internal)
410+
.Default(std::nullopt);
411+
if (!Opts.ClangHeaderMinAccess)
412+
Diags.diagnose(SourceLoc(), diag::error_invalid_clang_header_access_level,
413+
A->getValue());
414+
}
403415
for (const auto &arg :
404416
Args.getAllArgValues(options::OPT_clang_header_expose_module)) {
405417
auto splitArg = StringRef(arg).split('=');

lib/PrintAsClang/ModuleContentsWriter.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "PrintSwiftToClangCoreScaffold.h"
2121
#include "SwiftToClangInteropContext.h"
2222

23+
#include "swift/AST/AttrKind.h"
2324
#include "swift/AST/Decl.h"
2425
#include "swift/AST/DiagnosticsSema.h"
2526
#include "swift/AST/ExistentialLayout.h"
@@ -1151,35 +1152,43 @@ class ModuleWriter {
11511152
};
11521153
} // end anonymous namespace
11531154

1154-
static AccessLevel getRequiredAccess(const ModuleDecl &M) {
1155+
static AccessLevel getRequiredAccess(const ModuleDecl &M,
1156+
std::optional<AccessLevel> minAccess) {
1157+
if (minAccess)
1158+
return *minAccess;
11551159
return M.isExternallyConsumed() ? AccessLevel::Public : AccessLevel::Internal;
11561160
}
11571161

11581162
void swift::printModuleContentsAsObjC(
11591163
raw_ostream &os, llvm::SmallPtrSetImpl<ImportModuleTy> &imports,
1160-
ModuleDecl &M, SwiftToClangInteropContext &interopContext) {
1164+
ModuleDecl &M, SwiftToClangInteropContext &interopContext,
1165+
std::optional<AccessLevel> minAccess) {
11611166
llvm::raw_null_ostream prologueOS;
11621167
llvm::StringSet<> exposedModules;
1163-
ModuleWriter(os, prologueOS, imports, M, interopContext, getRequiredAccess(M),
1168+
ModuleWriter(os, prologueOS, imports, M, interopContext,
1169+
getRequiredAccess(M, minAccess),
11641170
/*requiresExposedAttribute=*/false, exposedModules,
11651171
OutputLanguageMode::ObjC)
11661172
.write();
11671173
}
11681174

11691175
void swift::printModuleContentsAsC(
11701176
raw_ostream &os, llvm::SmallPtrSetImpl<ImportModuleTy> &imports,
1171-
ModuleDecl &M, SwiftToClangInteropContext &interopContext) {
1177+
ModuleDecl &M, SwiftToClangInteropContext &interopContext,
1178+
std::optional<AccessLevel> minAccess) {
11721179
llvm::raw_null_ostream prologueOS;
11731180
llvm::StringSet<> exposedModules;
1174-
ModuleWriter(os, prologueOS, imports, M, interopContext, getRequiredAccess(M),
1181+
ModuleWriter(os, prologueOS, imports, M, interopContext,
1182+
getRequiredAccess(M, minAccess),
11751183
/*requiresExposedAttribute=*/false, exposedModules,
11761184
OutputLanguageMode::C)
11771185
.write();
11781186
}
11791187

11801188
EmittedClangHeaderDependencyInfo swift::printModuleContentsAsCxx(
11811189
raw_ostream &os, ModuleDecl &M, SwiftToClangInteropContext &interopContext,
1182-
bool requiresExposedAttribute, llvm::StringSet<> &exposedModules) {
1190+
AccessLevel minAccess, bool requiresExposedAttribute,
1191+
llvm::StringSet<> &exposedModules) {
11831192
std::string moduleContentsBuf;
11841193
llvm::raw_string_ostream moduleOS{moduleContentsBuf};
11851194
std::string modulePrologueBuf;
@@ -1197,8 +1206,8 @@ EmittedClangHeaderDependencyInfo swift::printModuleContentsAsCxx(
11971206

11981207
// FIXME: Use getRequiredAccess once @expose is supported.
11991208
ModuleWriter writer(moduleOS, prologueOS, info.imports, M, interopContext,
1200-
AccessLevel::Public, requiresExposedAttribute,
1201-
exposedModules, OutputLanguageMode::Cxx);
1209+
minAccess, requiresExposedAttribute, exposedModules,
1210+
OutputLanguageMode::Cxx);
12021211
writer.write();
12031212
info.dependsOnStandardLibrary = writer.isStdlibRequired();
12041213
if (M.isStdlibModule()) {

lib/PrintAsClang/ModuleContentsWriter.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@ using ImportModuleTy = PointerUnion<ModuleDecl*, const clang::Module*>;
3535
void printModuleContentsAsObjC(raw_ostream &os,
3636
llvm::SmallPtrSetImpl<ImportModuleTy> &imports,
3737
ModuleDecl &M,
38-
SwiftToClangInteropContext &interopContext);
38+
SwiftToClangInteropContext &interopContext,
39+
std::optional<AccessLevel> minAccess);
3940

4041
void printModuleContentsAsC(raw_ostream &os,
4142
llvm::SmallPtrSetImpl<ImportModuleTy> &imports,
4243
ModuleDecl &M,
43-
SwiftToClangInteropContext &interopContext);
44+
SwiftToClangInteropContext &interopContext,
45+
std::optional<AccessLevel> minAccess);
4446

4547
struct EmittedClangHeaderDependencyInfo {
4648
/// The set of imported modules used by this module.
@@ -52,9 +54,11 @@ struct EmittedClangHeaderDependencyInfo {
5254
/// Prints the declarations of \p M to \p os in C++ language mode.
5355
///
5456
/// \returns Dependencies required by this module.
55-
EmittedClangHeaderDependencyInfo printModuleContentsAsCxx(
56-
raw_ostream &os, ModuleDecl &M, SwiftToClangInteropContext &interopContext,
57-
bool requiresExposedAttribute, llvm::StringSet<> &exposedModules);
57+
EmittedClangHeaderDependencyInfo
58+
printModuleContentsAsCxx(raw_ostream &os, ModuleDecl &M,
59+
SwiftToClangInteropContext &interopContext,
60+
AccessLevel minAccess, bool requiresExposedAttribute,
61+
llvm::StringSet<> &exposedModules);
5862

5963
} // end namespace swift
6064

lib/PrintAsClang/PrintAsClang.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "SwiftToClangInteropContext.h"
1818

1919
#include "swift/AST/ASTContext.h"
20+
#include "swift/AST/AttrKind.h"
2021
#include "swift/AST/Module.h"
2122
#include "swift/AST/PrettyStackTrace.h"
2223
#include "swift/Basic/Assertions.h"
@@ -620,7 +621,8 @@ bool swift::printAsClangHeader(raw_ostream &os, ModuleDecl *M,
620621
if (M->getASTContext().LangOpts.hasFeature(Feature::CDecl)) {
621622
SmallPtrSet<ImportModuleTy, 8> imports;
622623
llvm::raw_string_ostream cModuleContents{moduleContentsScratch};
623-
printModuleContentsAsC(cModuleContents, imports, *M, interopContext);
624+
printModuleContentsAsC(cModuleContents, imports, *M, interopContext,
625+
frontendOpts.ClangHeaderMinAccess);
624626

625627
llvm::StringMap<StringRef> exposedModuleHeaderNames;
626628
writeImports(os, imports, *M, bridgingHeader, frontendOpts,
@@ -634,7 +636,8 @@ bool swift::printAsClangHeader(raw_ostream &os, ModuleDecl *M,
634636
// Objective-C content
635637
SmallPtrSet<ImportModuleTy, 8> imports;
636638
llvm::raw_string_ostream objcModuleContents{moduleContentsScratch};
637-
printModuleContentsAsObjC(objcModuleContents, imports, *M, interopContext);
639+
printModuleContentsAsObjC(objcModuleContents, imports, *M, interopContext,
640+
frontendOpts.ClangHeaderMinAccess);
638641
emitObjCConditional(os, [&] {
639642
llvm::StringMap<StringRef> exposedModuleHeaderNames;
640643
writeImports(os, imports, *M, bridgingHeader, frontendOpts,
@@ -685,6 +688,7 @@ bool swift::printAsClangHeader(raw_ostream &os, ModuleDecl *M,
685688
llvm::raw_string_ostream moduleContents{moduleContentsBuf};
686689
auto deps = printModuleContentsAsCxx(
687690
moduleContents, *M, interopContext,
691+
frontendOpts.ClangHeaderMinAccess.value_or(AccessLevel::Public),
688692
/*requiresExposedAttribute=*/requiresExplicitExpose, exposedModules);
689693
// FIXME: In ObjC++ mode, we do not need to reimport duplicate modules.
690694
llvm::StringMap<StringRef> exposedModuleHeaderNames;
@@ -701,9 +705,10 @@ bool swift::printAsClangHeader(raw_ostream &os, ModuleDecl *M,
701705
auto macroGuard = computeMacroGuard(M->getASTContext().getStdlibModule());
702706
os << "#ifndef " << macroGuard << "\n";
703707
os << "#define " << macroGuard << "\n";
704-
printModuleContentsAsCxx(
705-
os, *M->getASTContext().getStdlibModule(), interopContext,
706-
/*requiresExposedAttribute=*/true, exposedModules);
708+
printModuleContentsAsCxx(os, *M->getASTContext().getStdlibModule(),
709+
interopContext, AccessLevel::Public,
710+
/*requiresExposedAttribute=*/true,
711+
exposedModules);
707712
os << "#endif // " << macroGuard << "\n";
708713
}
709714

lib/PrintAsClang/SwiftToClangInteropContext.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ SwiftToClangInteropContext::SwiftToClangInteropContext(
2020
ModuleDecl &mod, const IRGenOptions &irGenOpts)
2121
: mod(mod), irGenOpts(irGenOpts) {}
2222

23-
SwiftToClangInteropContext::~SwiftToClangInteropContext() {}
23+
SwiftToClangInteropContext::~SwiftToClangInteropContext() = default;
2424

2525
IRABIDetailsProvider &SwiftToClangInteropContext::getIrABIDetails() {
2626
if (!irABIDetails)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend %s -module-name Core -typecheck -verify -emit-clang-header-path %t/core.h -clang-header-expose-decls=has-expose-attr -emit-clang-header-min-access public -package-name Core
3+
// RUN: %FileCheck %s --check-prefix CHECK-PUBLIC < %t/core.h
4+
5+
// RUN: %empty-directory(%t)
6+
// RUN: %target-swift-frontend %s -module-name Core -typecheck -verify -emit-clang-header-path %t/core.h -clang-header-expose-decls=has-expose-attr -emit-clang-header-min-access package -package-name Core
7+
// RUN: %FileCheck %s --check-prefix CHECK-PACKAGE < %t/core.h
8+
9+
// RUN: %empty-directory(%t)
10+
// RUN: %target-swift-frontend %s -module-name Core -typecheck -verify -emit-clang-header-path %t/core.h -clang-header-expose-decls=has-expose-attr -emit-clang-header-min-access internal -package-name Core
11+
// RUN: %FileCheck %s --check-prefix CHECK-INTERNAL < %t/core.h
12+
13+
@_expose(Cxx)
14+
public func publicFunc(_ x: Int) -> Int {
15+
return x
16+
}
17+
18+
@_expose(Cxx)
19+
package func packageFunc(_ x: Int) -> Int {
20+
return x
21+
}
22+
23+
@_expose(Cxx)
24+
internal func internalFunc(_ x: Int) -> Int {
25+
return x
26+
}
27+
28+
@_expose(Cxx)
29+
private func privateFunc(_ x: Int) -> Int {
30+
return x
31+
}
32+
33+
// CHECK-PUBLIC-NOT: internalFunc
34+
// CHECK-PUBLIC-NOT: packageFunc
35+
// CHECK-PUBLIC-NOT: privateFunc
36+
// CHECK-PUBLIC: SWIFT_INLINE_THUNK swift::Int publicFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core10publicFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
37+
38+
// CHECK-PACKAGE-NOT: internalFunc
39+
// CHECK-PACKAGE: SWIFT_INLINE_THUNK swift::Int packageFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core11packageFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
40+
// CHECK-PACKAGE-NOT: privateFunc
41+
// CHECK-PACKAGE: SWIFT_INLINE_THUNK swift::Int publicFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core10publicFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
42+
43+
// CHECK-INTERNAL: SWIFT_INLINE_THUNK swift::Int internalFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core12internalFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
44+
// CHECK-INTERNAL: SWIFT_INLINE_THUNK swift::Int packageFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core11packageFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
45+
// CHECK-INTERNAL-NOT: privateFunc
46+
// CHECK-INTERNAL: SWIFT_INLINE_THUNK swift::Int publicFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core10publicFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend %s -module-name Core -typecheck -verify -emit-clang-header-path %t/core.h -clang-header-expose-decls=all-public -emit-clang-header-min-access public -package-name Core
3+
// RUN: %FileCheck %s --check-prefix CHECK-PUBLIC < %t/core.h
4+
5+
// RUN: %empty-directory(%t)
6+
// RUN: %target-swift-frontend %s -module-name Core -typecheck -verify -emit-clang-header-path %t/core.h -clang-header-expose-decls=all-public -emit-clang-header-min-access package -package-name Core
7+
// RUN: %FileCheck %s --check-prefix CHECK-PACKAGE < %t/core.h
8+
9+
// RUN: %empty-directory(%t)
10+
// RUN: %target-swift-frontend %s -module-name Core -typecheck -verify -emit-clang-header-path %t/core.h -clang-header-expose-decls=all-public -emit-clang-header-min-access internal -package-name Core
11+
// RUN: %FileCheck %s --check-prefix CHECK-INTERNAL < %t/core.h
12+
13+
// RUN: %empty-directory(%t)
14+
// RUN: not %target-swift-frontend %s -module-name Core -typecheck -emit-clang-header-path %t/core.h -clang-header-expose-decls=all-public -emit-clang-header-min-access inernal -package-name Core 2>&1 | %FileCheck %s --check-prefix CHECK-DIAGNOSTIC
15+
16+
public func publicFunc(_ x: Int) -> Int {
17+
return x
18+
}
19+
20+
package func packageFunc(_ x: Int) -> Int {
21+
return x
22+
}
23+
24+
internal func internalFunc(_ x: Int) -> Int {
25+
return x
26+
}
27+
28+
private func privateFunc(_ x: Int) -> Int {
29+
return x
30+
}
31+
32+
public struct S {
33+
public func publicMethod(_ x: Int) -> Int {
34+
return x
35+
}
36+
37+
package func packageMethod(_ x: Int) -> Int {
38+
return x
39+
}
40+
41+
internal func internalMethod(_ x: Int) -> Int {
42+
return x
43+
}
44+
45+
private func privateMethod(_ x: Int) -> Int {
46+
return x
47+
}
48+
49+
private var x: Int
50+
}
51+
52+
// CHECK-PUBLIC-NOT: internalFunc
53+
// CHECK-PUBLIC-NOT: packageFunc
54+
// CHECK-PUBLIC-NOT: privateFunc
55+
// CHECK-PUBLIC: SWIFT_INLINE_THUNK swift::Int publicFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core10publicFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
56+
// CHECK-PUBLIC: SWIFT_INLINE_THUNK swift::Int S::publicMethod(swift::Int x) const {
57+
// CHECK-PUBLIC-NOT: packageMethod
58+
// CHECK-PUBLIC-NOT: internalMethod
59+
// CHECK-PUBLIC-NOT: privateMethod
60+
61+
// CHECK-PACKAGE-NOT: internalFunc
62+
// CHECK-PACKAGE: SWIFT_INLINE_THUNK swift::Int packageFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core11packageFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
63+
// CHECK-PACKAGE-NOT: privateFunc
64+
// CHECK-PACKAGE: SWIFT_INLINE_THUNK swift::Int publicFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core10publicFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
65+
// CHECK-PACKAGE: SWIFT_INLINE_THUNK swift::Int S::publicMethod(swift::Int x) const {
66+
// CHECK-PACKAGE: SWIFT_INLINE_THUNK swift::Int S::packageMethod(swift::Int x) const {
67+
// CHECK-PACKAGE-NOT: internalMethod
68+
// CHECK-PACKAGE-NOT: privateMethod
69+
70+
// CHECK-INTERNAL: SWIFT_INLINE_THUNK swift::Int internalFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core12internalFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
71+
// CHECK-INTERNAL: SWIFT_INLINE_THUNK swift::Int packageFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core11packageFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
72+
// CHECK-INTERNAL-NOT: privateFunc
73+
// CHECK-INTERNAL: SWIFT_INLINE_THUNK swift::Int publicFunc(swift::Int x) noexcept SWIFT_SYMBOL("s:4Core10publicFuncyS2iF") SWIFT_WARN_UNUSED_RESULT {
74+
// CHECK-INTERNAL: SWIFT_INLINE_THUNK swift::Int S::publicMethod(swift::Int x) const {
75+
// CHECK-INTERNAL: SWIFT_INLINE_THUNK swift::Int S::packageMethod(swift::Int x) const {
76+
// CHECK-INTERNAL: SWIFT_INLINE_THUNK swift::Int S::internalMethod(swift::Int x) const {
77+
// CHECK-INTERNAL-NOT: privateMethod
78+
79+
// CHECK-DIAGNOSTIC: error: invalid minimum clang header access level 'inernal'; chose from 'public'|'package'|'internal'

0 commit comments

Comments
 (0)