mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Treat internally-imported bridging headers as internally-imported
When using an internal import for a bridging header, semantically treat the contents of the bridging header, and anything that it imports, as if they were imported internally. This is the actual semantic behavior we wanted from internally-imported bridging headers. This is the main semantic checking bit for rdar://74011750.
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
#include "ctypes.h"
|
||||
#include "macros.h"
|
||||
|
||||
typedef struct {
|
||||
double x, y;
|
||||
} MyPoint;
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: mkdir -p %t/tmp
|
||||
|
||||
// Test with the normal bridging header.
|
||||
// RUN: %target-typecheck-verify-swift -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -sdk %clang-importer-sdk
|
||||
|
||||
// Test with a precompiled bridging header.
|
||||
// RUN: %target-swift-frontend -emit-pch -o %t/c-bridging-header.pch %S/../Inputs/c-bridging-header.h -sdk %clang-importer-sdk
|
||||
// RUN: %target-typecheck-verify-swift -internal-import-bridging-header %t/c-bridging-header.pch -sdk %clang-importer-sdk
|
||||
|
||||
|
||||
// Overrides the internal import that comes through the bridging header.
|
||||
public import macros
|
||||
|
||||
public func getRed() -> Color { red } // expected-error{{function cannot be declared public because its result uses an internal type}}
|
||||
// expected-note@-1{{struct 'Color' is imported by this file as 'internal' from bridging header}}
|
||||
|
||||
public func getX(point: MyPoint) -> Double { point.x } // expected-error{{function cannot be declared public because its parameter uses an internal type}}
|
||||
// expected-note@-1{{struct 'MyPoint' is imported by this file as 'internal' from bridging header}}
|
||||
|
||||
// Comes from the macros module.
|
||||
public func returnsFromMacrosModule() -> okay_t { 0 }
|
||||
@@ -2,49 +2,49 @@
|
||||
// RUN: mkdir -p %t/tmp
|
||||
|
||||
// First test the explicit frontend-based bridging PCH generation and use works
|
||||
// RUN: %target-swift-frontend -emit-pch -o %t/c-bridging-header.pch %S/../Inputs/c-bridging-header.h
|
||||
// RUN: %target-typecheck-verify-swift -internal-import-bridging-header %t/c-bridging-header.pch
|
||||
// RUN: %target-swift-frontend -emit-pch -o %t/c-bridging-header.pch %S/../Inputs/c-bridging-header.h -sdk %clang-importer-sdk
|
||||
// RUN: %target-typecheck-verify-swift -internal-import-bridging-header %t/c-bridging-header.pch -sdk %clang-importer-sdk
|
||||
|
||||
// Now test the driver-automated version is inert when disabled
|
||||
// Output path of the PCH differs in the new driver, so force SWIFT_USE_OLD_DRIVER for now.
|
||||
// RUN: env TMPDIR=%t/tmp/ SWIFT_USE_OLD_DRIVER=1 %target-swiftc_driver -typecheck -disable-bridging-pch -save-temps %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h
|
||||
// RUN: env TMPDIR=%t/tmp/ SWIFT_USE_OLD_DRIVER=1 %target-swiftc_driver -typecheck -disable-bridging-pch -save-temps %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -sdk %clang-importer-sdk
|
||||
// RUN: not ls %t/tmp/*.pch >/dev/null 2>&1
|
||||
|
||||
// Test the driver-automated version works by default
|
||||
// Output path of the PCH differs in the new driver, so force SWIFT_USE_OLD_DRIVER for now.
|
||||
// RUN: env TMPDIR=%t/tmp/ SWIFT_USE_OLD_DRIVER=1 %target-swiftc_driver -typecheck -save-temps %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h
|
||||
// RUN: env TMPDIR=%t/tmp/ SWIFT_USE_OLD_DRIVER=1 %target-swiftc_driver -typecheck -save-temps %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -sdk %clang-importer-sdk
|
||||
// RUN: ls %t/tmp/*.pch >/dev/null 2>&1
|
||||
// RUN: llvm-objdump --raw-clang-ast %t/tmp/*.pch | llvm-bcanalyzer -dump | %FileCheck %s
|
||||
// CHECK: ORIGINAL_FILE{{.*}}Inputs/c-bridging-header.h
|
||||
|
||||
// Test the driver-automated version deletes its PCH file when done
|
||||
// RUN: rm %t/tmp/*.pch
|
||||
// RUN: env TMPDIR=%t/tmp/ %target-swiftc_driver -typecheck %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h
|
||||
// RUN: env TMPDIR=%t/tmp/ %target-swiftc_driver -typecheck %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -sdk %clang-importer-sdk
|
||||
// RUN: not ls %t/tmp/*.pch >/dev/null 2>&1
|
||||
|
||||
// Test -emit-pch invocation but with a persistent PCH
|
||||
// RUN: %target-swift-frontend -emit-pch -pch-output-dir %t/pch %S/../Inputs/c-bridging-header.h
|
||||
// RUN: %target-typecheck-verify-swift -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -pch-output-dir %t/pch -pch-disable-validation
|
||||
// RUN: %target-swift-frontend -emit-pch -pch-output-dir %t/pch %S/../Inputs/c-bridging-header.h -sdk %clang-importer-sdk
|
||||
// RUN: %target-typecheck-verify-swift -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -pch-output-dir %t/pch -pch-disable-validation -sdk %clang-importer-sdk
|
||||
// RUN: ls %t/pch/*.pch >/dev/null 2>&1
|
||||
|
||||
// Test implicit use of persistent PCH
|
||||
// RUN: %target-typecheck-verify-swift -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -pch-output-dir %t/pch2
|
||||
// RUN: %target-typecheck-verify-swift -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -pch-output-dir %t/pch2 -sdk %clang-importer-sdk
|
||||
// RUN: ls %t/pch2/*.pch >/dev/null 2>&1
|
||||
|
||||
// RUN: touch %t/header.with.dot.h
|
||||
// RUN: touch %t/test.swift
|
||||
// RUN: %target-swift-frontend -typecheck %t/test.swift -internal-import-bridging-header %t/header.with.dot.h -pch-output-dir %t/pch_with_dot -module-cache-path %t/mcp1
|
||||
// RUN: %target-swift-frontend -typecheck %t/test.swift -internal-import-bridging-header %t/header.with.dot.h -pch-output-dir %t/pch_with_dot -module-cache-path %t/mcp2
|
||||
// RUN: %target-swift-frontend -typecheck %t/test.swift -internal-import-bridging-header %t/header.with.dot.h -pch-output-dir %t/pch_with_dot -module-cache-path %t/mcp1 -sdk %clang-importer-sdk
|
||||
// RUN: %target-swift-frontend -typecheck %t/test.swift -internal-import-bridging-header %t/header.with.dot.h -pch-output-dir %t/pch_with_dot -module-cache-path %t/mcp2 -sdk %clang-importer-sdk
|
||||
// RUN: ls %t/pch_with_dot/*swift*clang*.pch | count 2
|
||||
|
||||
// Test the driver-automated version using persistent PCH
|
||||
// RUN: %target-swiftc_driver -typecheck -save-temps %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -pch-output-dir %t/pch3
|
||||
// RUN: %target-swiftc_driver -typecheck -save-temps %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -pch-output-dir %t/pch3 -sdk %clang-importer-sdk
|
||||
// RUN: ls %t/pch3/*.pch >/dev/null 2>&1
|
||||
// RUN: llvm-objdump --raw-clang-ast %t/pch3/*.pch | llvm-bcanalyzer -dump | %FileCheck %s -check-prefix=PERSISTENT
|
||||
// PERSISTENT: ORIGINAL_FILE{{.*}}Inputs/c-bridging-header.h
|
||||
|
||||
// Test that -pch-disable-validation works in that it won't implicitly create a PCH
|
||||
// RUN: not %target-swift-frontend -typecheck %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -pch-output-dir %t/no-pch -pch-disable-validation 2>&1 | %FileCheck %s -check-prefix=NO-VALIDATION
|
||||
// RUN: not %target-swift-frontend -typecheck %s -internal-import-bridging-header %S/../Inputs/c-bridging-header.h -pch-output-dir %t/no-pch -pch-disable-validation -sdk %clang-importer-sdk 2>&1 | %FileCheck %s -check-prefix=NO-VALIDATION
|
||||
// NO-VALIDATION: PCH file {{.*}} not found
|
||||
|
||||
func getX(point: MyPoint) -> Double { point.x }
|
||||
|
||||
Reference in New Issue
Block a user