Skip to content

Commit 146f9e8

Browse files
committed
[interop][SwiftToC] print out nullability specifiers for primitive C types
1 parent 891d7b0 commit 146f9e8

File tree

3 files changed

+18
-9
lines changed

3 files changed

+18
-9
lines changed

lib/PrintAsClang/PrintClangFunction.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "PrintClangFunction.h"
14+
#include "ClangSyntaxPrinter.h"
1415
#include "DeclAndTypePrinter.h"
1516
#include "PrimitiveTypeMapping.h"
1617
#include "swift/AST/Decl.h"
@@ -26,21 +27,21 @@ using namespace swift;
2627
// native Swift function/method.
2728
class CFunctionSignatureTypePrinter
2829
: public TypeVisitor<CFunctionSignatureTypePrinter, void,
29-
Optional<OptionalTypeKind>> {
30+
Optional<OptionalTypeKind>>,
31+
private ClangSyntaxPrinter {
3032
public:
3133
CFunctionSignatureTypePrinter(raw_ostream &os,
3234
PrimitiveTypeMapping &typeMapping)
33-
: os(os), typeMapping(typeMapping) {}
35+
: ClangSyntaxPrinter(os), typeMapping(typeMapping) {}
3436

3537
bool printIfKnownSimpleType(const TypeDecl *typeDecl,
3638
Optional<OptionalTypeKind> optionalKind) {
3739
auto knownTypeInfo = typeMapping.getKnownCTypeInfo(typeDecl);
3840
if (!knownTypeInfo)
3941
return false;
4042
os << knownTypeInfo->name;
41-
// FIXME:
42-
// if (knownTypeInfo->canBeNullable)
43-
// printNullability(optionalKind);
43+
if (knownTypeInfo->canBeNullable)
44+
printNullability(optionalKind);
4445
return true;
4546
}
4647

@@ -81,7 +82,6 @@ class CFunctionSignatureTypePrinter
8182
}
8283

8384
private:
84-
raw_ostream &os;
8585
PrimitiveTypeMapping &typeMapping;
8686
};
8787

test/Interop/SwiftToC/functions/swift-primitive-functions-c-bridging.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,19 @@
2929
// CHECK-NEXT: SWIFT_EXTERN int32_t $s9Functions16passThroughInt32ys0D0VADF(int32_t x) SWIFT_NOEXCEPT SWIFT_CALL;
3030
// CHECK-NEXT: SWIFT_EXTERN int64_t $s9Functions16passThroughInt64ys0D0VADF(int64_t x) SWIFT_NOEXCEPT SWIFT_CALL;
3131
// CHECK-NEXT: SWIFT_EXTERN int8_t $s9Functions15passThroughInt8ys0D0VADF(int8_t x) SWIFT_NOEXCEPT SWIFT_CALL;
32-
// CHECK-NEXT: SWIFT_EXTERN void * $s9Functions24passThroughOpaquePointerys0dE0VADF(void * x) SWIFT_NOEXCEPT SWIFT_CALL;
32+
// CHECK-NEXT: SWIFT_EXTERN void * _Nonnull $s9Functions24passThroughOpaquePointerys0dE0VADF(void * _Nonnull x) SWIFT_NOEXCEPT SWIFT_CALL;
3333
// CHECK-NEXT: SWIFT_EXTERN size_t $s9Functions15passThroughUIntyS2uF(size_t x) SWIFT_NOEXCEPT SWIFT_CALL;
3434
// CHECK-NEXT: SWIFT_EXTERN uint16_t $s9Functions17passThroughUInt16ys0D0VADF(uint16_t x) SWIFT_NOEXCEPT SWIFT_CALL;
3535
// CHECK-NEXT: SWIFT_EXTERN uint32_t $s9Functions17passThroughUInt32ys0D0VADF(uint32_t x) SWIFT_NOEXCEPT SWIFT_CALL;
3636
// CHECK-NEXT: SWIFT_EXTERN uint64_t $s9Functions17passThroughUInt64ys0D0VADF(uint64_t x) SWIFT_NOEXCEPT SWIFT_CALL;
3737
// CHECK-NEXT: SWIFT_EXTERN uint8_t $s9Functions16passThroughUInt8ys0D0VADF(uint8_t x) SWIFT_NOEXCEPT SWIFT_CALL;
38-
// CHECK-NEXT: SWIFT_EXTERN void * $s9Functions34passThroughUnsafeMutableRawPointeryS2vF(void * x) SWIFT_NOEXCEPT SWIFT_CALL;
39-
// CHECK-NEXT: SWIFT_EXTERN void const * $s9Functions27passThroughUnsafeRawPointeryS2VF(void const * x) SWIFT_NOEXCEPT SWIFT_CALL;
38+
// CHECK-NEXT: SWIFT_EXTERN void * _Nonnull $s9Functions34passThroughUnsafeMutableRawPointeryS2vF(void * _Nonnull x) SWIFT_NOEXCEPT SWIFT_CALL;
39+
// CHECK-NEXT: SWIFT_EXTERN void const * _Nonnull $s9Functions27passThroughUnsafeRawPointeryS2VF(void const * _Nonnull x) SWIFT_NOEXCEPT SWIFT_CALL;
40+
// CHECK-NEXT: SWIFT_EXTERN void * _Nullable $s9Functions42roundTwoPassThroughUnsafeMutableRawPointerySvSgACF(void * _Nullable x) SWIFT_NOEXCEPT SWIFT_CALL;
41+
// CHECK-EMPTY:
42+
// CHECK-NEXT: #ifdef __cplusplus
43+
// CHECK-NEXT: }
44+
// CHECK-NEXT: }
4045

4146
public func passThroughCBool(_ x: CBool) -> CBool { return x }
4247

@@ -82,3 +87,5 @@ public func passThroughBool(_ x: Bool) -> Bool { return x }
8287
public func passThroughOpaquePointer(_ x: OpaquePointer) -> OpaquePointer { return x }
8388
public func passThroughUnsafeRawPointer(_ x: UnsafeRawPointer) -> UnsafeRawPointer { return x }
8489
public func passThroughUnsafeMutableRawPointer(_ x: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer { return x }
90+
91+
public func roundTwoPassThroughUnsafeMutableRawPointer(_ x: UnsafeMutableRawPointer?) -> UnsafeMutableRawPointer? { return x }

test/lit.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,8 @@ extraCheckWarningFlags = (
588588
# Verifies that a C++ file can be compiled without warnings except for some exceptions.
589589
config.substitutions.insert(0, ('%check-c-header-in-clang',
590590
'%clang -fsyntax-only -x c-header ' + extraCheckWarningFlags +
591+
# Don't warn about nullability specifiers in C code.
592+
'-Wno-nullability-extension '
591593
# Use standard header/framework search paths.
592594
'-F %%clang-importer-sdk-path/frameworks '
593595
'-I %%clang-include-dir '

0 commit comments

Comments
 (0)