Enable lazy ClangImporter diagnostics by default

Replace the existing `-enable-experimental-clang-importer-diagnostics`
flag with an opt-out version entitled `-disable-experimentalc-clang-importer-diagnostics`.
Enable the beviour previously hidden behind the old flag by default.
This commit is contained in:
Nuri Amari
2022-01-16 13:28:59 -05:00
parent 3762ca1fa7
commit 7ec861fbd9
16 changed files with 127 additions and 20 deletions

View File

@@ -328,8 +328,8 @@ namespace swift {
/// Enable experimental flow-sensitive concurrent captures. /// Enable experimental flow-sensitive concurrent captures.
bool EnableExperimentalFlowSensitiveConcurrentCaptures = false; bool EnableExperimentalFlowSensitiveConcurrentCaptures = false;
/// Enable experimental ClangImporter diagnostics. /// Disable experimental ClangImporter diagnostics.
bool EnableExperimentalClangImporterDiagnostics = false; bool DisableExperimentalClangImporterDiagnostics = false;
/// Enable experimental eager Clang module diagnostics. /// Enable experimental eager Clang module diagnostics.
bool EnableExperimentalEagerClangModuleDiagnostics = false; bool EnableExperimentalEagerClangModuleDiagnostics = false;

View File

@@ -287,9 +287,9 @@ def enable_experimental_flow_sensitive_concurrent_captures :
Flag<["-"], "enable-experimental-flow-sensitive-concurrent-captures">, Flag<["-"], "enable-experimental-flow-sensitive-concurrent-captures">,
HelpText<"Enable flow-sensitive concurrent captures">; HelpText<"Enable flow-sensitive concurrent captures">;
def enable_experimental_clang_importer_diagnostics : def disable_experimental_clang_importer_diagnostics :
Flag<["-"], "enable-experimental-clang-importer-diagnostics">, Flag<["-"], "disable-experimental-clang-importer-diagnostics">,
HelpText<"Enable experimental diagnostics when importing C, C++, and Objective-C libraries">; HelpText<"Disable experimental diagnostics when importing C, C++, and Objective-C libraries">;
def enable_experimental_eager_clang_module_diagnostics : def enable_experimental_eager_clang_module_diagnostics :
Flag<["-"], "enable-experimental-eager-clang-module-diagnostics">, Flag<["-"], "enable-experimental-eager-clang-module-diagnostics">,

View File

@@ -2397,8 +2397,7 @@ void ClangImporter::Implementation::addImportDiagnostic(
ImportDiagnosticTarget target, Diagnostic &&diag, ImportDiagnosticTarget target, Diagnostic &&diag,
const clang::SourceLocation &loc) { const clang::SourceLocation &loc) {
ImportDiagnostic importDiag = ImportDiagnostic(target, diag, loc); ImportDiagnostic importDiag = ImportDiagnostic(target, diag, loc);
if (!(SwiftContext.LangOpts.EnableExperimentalClangImporterDiagnostics || if (SwiftContext.LangOpts.DisableExperimentalClangImporterDiagnostics ||
SwiftContext.LangOpts.EnableExperimentalEagerClangModuleDiagnostics) ||
CollectedDiagnostics.count(importDiag)) CollectedDiagnostics.count(importDiag))
return; return;

View File

@@ -470,10 +470,11 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
Opts.EnableExperimentalFlowSensitiveConcurrentCaptures |= Opts.EnableExperimentalFlowSensitiveConcurrentCaptures |=
Args.hasArg(OPT_enable_experimental_flow_sensitive_concurrent_captures); Args.hasArg(OPT_enable_experimental_flow_sensitive_concurrent_captures);
Opts.EnableExperimentalClangImporterDiagnostics |= Opts.DisableExperimentalClangImporterDiagnostics |=
Args.hasArg(OPT_enable_experimental_clang_importer_diagnostics); Args.hasArg(OPT_disable_experimental_clang_importer_diagnostics);
Opts.EnableExperimentalEagerClangModuleDiagnostics |= Opts.EnableExperimentalEagerClangModuleDiagnostics |=
!Args.hasArg(OPT_disable_experimental_clang_importer_diagnostics) &&
Args.hasArg(OPT_enable_experimental_eager_clang_module_diagnostics); Args.hasArg(OPT_enable_experimental_eager_clang_module_diagnostics);
Opts.DisableImplicitConcurrencyModuleImport |= Opts.DisableImplicitConcurrencyModuleImport |=

View File

@@ -3627,7 +3627,7 @@ bool MissingMemberFailure::diagnoseAsError() {
.highlight(getSourceRange()) .highlight(getSourceRange())
.highlight(nameLoc.getSourceRange()); .highlight(nameLoc.getSourceRange());
const auto &ctx = getSolution().getDC()->getASTContext(); const auto &ctx = getSolution().getDC()->getASTContext();
if (ctx.LangOpts.EnableExperimentalClangImporterDiagnostics) { if (!ctx.LangOpts.DisableExperimentalClangImporterDiagnostics) {
ctx.getClangModuleLoader()->diagnoseMemberValue(getName().getFullName(), ctx.getClangModuleLoader()->diagnoseMemberValue(getName().getFullName(),
baseType); baseType);
} }

View File

@@ -590,7 +590,7 @@ Expr *TypeChecker::resolveDeclRefExpr(UnresolvedDeclRefExpr *UDRE,
.diagnose(Loc, diag::cannot_find_in_scope, Name, .diagnose(Loc, diag::cannot_find_in_scope, Name,
Name.isOperator()) Name.isOperator())
.highlight(UDRE->getSourceRange()); .highlight(UDRE->getSourceRange());
if (Context.LangOpts.EnableExperimentalClangImporterDiagnostics) { if (!Context.LangOpts.DisableExperimentalClangImporterDiagnostics) {
Context.getClangModuleLoader()->diagnoseTopLevelValue( Context.getClangModuleLoader()->diagnoseTopLevelValue(
Name.getFullName()); Name.getFullName());
} }

View File

@@ -1,4 +1,4 @@
// RUN: not %target-swift-frontend -enable-experimental-clang-importer-diagnostics -enable-objc-interop -import-objc-header %S/Inputs/experimental_clang_importer_diagnostics_bridging_header.h -typecheck %s 2>&1 | %FileCheck %s // RUN: not %target-swift-frontend -enable-objc-interop -import-objc-header %S/Inputs/experimental_clang_importer_diagnostics_bridging_header.h -typecheck %s 2>&1 | %FileCheck %s
let s: PartialImport let s: PartialImport
s.c = 5 s.c = 5

View File

@@ -1,4 +1,4 @@
// RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-experimental-clang-importer-diagnostics -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace // RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace
import cfuncs import cfuncs

View File

@@ -1,4 +1,4 @@
// RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-experimental-clang-importer-diagnostics -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace // RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace
import macros import macros
@@ -13,7 +13,6 @@ _ = INVALID_INTEGER_LITERAL_2
// CHECK-NEXT: #define INVALID_INTEGER_LITERAL_2 10abc // CHECK-NEXT: #define INVALID_INTEGER_LITERAL_2 10abc
// CHECK-NEXT: {{^}} ^ // CHECK-NEXT: {{^}} ^
_ = FUNC_LIKE_MACRO() _ = FUNC_LIKE_MACRO()
// CHECK: experimental_diagnostics_cmacros.swift:{{[0-9]+}}:{{[0-9]+}}: error: cannot find 'FUNC_LIKE_MACRO' in scope // CHECK: experimental_diagnostics_cmacros.swift:{{[0-9]+}}:{{[0-9]+}}: error: cannot find 'FUNC_LIKE_MACRO' in scope
// CHECK-NEXT: _ = FUNC_LIKE_MACRO() // CHECK-NEXT: _ = FUNC_LIKE_MACRO()

View File

@@ -1,4 +1,4 @@
// RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-experimental-clang-importer-diagnostics -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace // RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace
import ctypes import ctypes

View File

@@ -1,4 +1,4 @@
// RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-experimental-clang-importer-diagnostics -enable-objc-interop -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace // RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-objc-interop -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace
// REQUIRES: objc_interop // REQUIRES: objc_interop

View File

@@ -1,4 +1,4 @@
// RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-experimental-clang-importer-diagnostics -enable-objc-interop -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace // RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-objc-interop -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace
// REQUIRES: objc_interop // REQUIRES: objc_interop

View File

@@ -1,4 +1,4 @@
// RUN: not %target-swift-frontend -I %S/Inputs/custom-modules -enable-experimental-clang-importer-diagnostics -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace // RUN: not %target-swift-frontend -I %S/Inputs/custom-modules -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace
// This test tests that requests for diagnosis, performed by name, // This test tests that requests for diagnosis, performed by name,
// resolve to the correct Clang declarations, even when the same name is used // resolve to the correct Clang declarations, even when the same name is used

View File

@@ -0,0 +1,72 @@
// RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-objc-interop -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace
// REQUIRES: objc_interop
// Referencing a single declaration should only surface diagnostics about that declaration, no more
import IncompleteTypes
import cfuncs
import ctypes
// CHECK-NOT: note
// CHECK-NOT: warning
// CHECK-NOT: error
let bar = Bar()
_ = bar.methodReturningForwardDeclaredInterface()
// CHECK: experimental_diagnostics_no_noise.swift:{{[0-9]+}}:{{[0-9]+}}: error: value of type 'Bar' has no member 'methodReturningForwardDeclaredInterface'
// CHECK-NEXT: _ = bar.methodReturningForwardDeclaredInterface()
// CHECK-NEXT: ~~~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK-NEXT: IncompleteTypes.h:{{[0-9]+}}:{{[0-9]+}}: note: method 'methodReturningForwardDeclaredInterface' not imported
// CHECK-NEXT: - (ForwardDeclaredInterface *) methodReturningForwardDeclaredInterface;
// CHECK-NEXT: ^
// CHECK-NEXT: IncompleteTypes.h:{{[0-9]+}}:{{[0-9]+}}: note: return type not imported
// CHECK-NEXT: - (ForwardDeclaredInterface *) methodReturningForwardDeclaredInterface;
// CHECK-NEXT: ^
// CHECK-NEXT: IncompleteTypes.h:{{[0-9]+}}:{{[0-9]+}}: note: interface 'ForwardDeclaredInterface' is incomplete
// CHECK-NEXT: - (ForwardDeclaredInterface *) methodReturningForwardDeclaredInterface;
// CHECK-NEXT: ^
// CHECK-NEXT: IncompleteTypes.h:{{[0-9]+}}:{{[0-9]+}}: note: interface 'ForwardDeclaredInterface' forward declared here
// CHECK-NEXT: @class ForwardDeclaredInterface;
// CHECK-NEXT: ^
// CHECK-NOT: note
// CHECK-NOT: warning
// CHECK-NOT: error
unsupported_parameter_type(1,2)
// CHECK: experimental_diagnostics_no_noise.swift:{{[0-9]+}}:{{[0-9]+}}: error: cannot find 'unsupported_parameter_type' in scope
// CHECK-NEXT: unsupported_parameter_type(1,2)
// CHECK-NEXT: ^~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK-NEXT: cfuncs.h:{{[0-9]+}}:{{[0-9]+}}: note: function 'unsupported_parameter_type' not imported
// CHECK-NEXT: int unsupported_parameter_type(int param1, _Complex int param2);
// CHECK-NEXT: {{^}}^
// CHECK-NEXT: cfuncs.h:{{[0-9]+}}:{{[0-9]+}}: note: parameter 'param2' not imported
// CHECK-NEXT: int unsupported_parameter_type(int param1, _Complex int param2);
// CHECK-NEXT: {{^}} ^
// CHECK-NEXT: cfuncs.h:{{[0-9]+}}:{{[0-9]+}}: note: built-in type 'Complex' not supported
// CHECK-NEXT: int unsupported_parameter_type(int param1, _Complex int param2);
// CHECK-NEXT: {{^}} ^
// CHECK-NOT: note
// CHECK-NOT: warning
// CHECK-NOT: error
let s: PartialImport
s.c = 5
// CHECK: experimental_diagnostics_no_noise.swift:{{[0-9]+}}:{{[0-9]+}}: error: value of type 'PartialImport' has no member 'c'
// CHECK-NEXT: s.c = 5
// CHECK-NEXT: ~ ^
// CHECK-NEXT: ctypes.h:{{[0-9]+}}:{{[0-9]+}}: note: field 'c' not imported
// CHECK-NEXT: int _Complex c;
// CHECK-NEXT: ^
// CHECK-NEXT: ctypes.h:{{[0-9]+}}:{{[0-9]+}}: note: built-in type 'Complex' not supported
// CHECK-NEXT: int _Complex c;
// CHECK-NEXT: ^
// CHECK-NEXT: ctypes.PartialImport:{{[0-9]+}}:{{[0-9]+}}: note: did you mean 'a'?
// CHECK-NEXT: public var a: Int32
// CHECK-NEXT: ^
// CHECK-NEXT: ctypes.PartialImport:{{[0-9]+}}:{{[0-9]+}}: note: did you mean 'b'?
// CHECK-NEXT: public var b: Int32
// CHECK-NEXT: ^
// CHECK-NOT: note
// CHECK-NOT: warning
// CHECK-NOT: error

View File

@@ -0,0 +1,36 @@
// RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -disable-experimental-clang-importer-diagnostics -enable-objc-interop -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace
// REQUIRES: objc_interop
import cfuncs
import ctypes
import IncompleteTypes
// CHECK-NOT: warning
// CHECK-NOT: error
// CHECK-NOT: note
let bar = Bar()
_ = bar.methodReturningForwardDeclaredInterface()
// CHECK: experimental_diagnostics_opt_out.swift:{{[0-9]+}}:{{[0-9]+}}: error: value of type 'Bar' has no member 'methodReturningForwardDeclaredInterface'
// CHECK-NOT: warning
// CHECK-NOT: error
// CHECK-NOT: note
// CHECK-NOT: warning
// CHECK-NOT: error
let s: PartialImport
s.c = 5
// CHECK: experimental_diagnostics_opt_out.swift:{{[0-9]+}}:{{[0-9]+}}: error: value of type 'PartialImport' has no member 'c'
// CHECK: ctypes.PartialImport:{{[0-9]+}}:{{[0-9]+}}: note: did you mean 'a'?
// CHECK: ctypes.PartialImport:{{[0-9]+}}:{{[0-9]+}}: note: did you mean 'b'?
// CHECK-NOT: warning
// CHECK-NOT: error
// CHECK-NOT: note
// CHECK-NOT: warning
// CHECK-NOT: error
unsupported_parameter_type(1,2)
// CHECK: experimental_diagnostics_opt_out.swift:{{[0-9]+}}:{{[0-9]+}}: error: cannot find 'unsupported_parameter_type' in scope
// CHECK-NOT: warning
// CHECK-NOT: error
// CHECK-NOT: note

View File

@@ -1,4 +1,4 @@
// RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-experimental-clang-importer-diagnostics -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace // RUN: not %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck %s 2>&1 | %FileCheck %s --strict-whitespace
import macros import macros