| // RUN: rm -rf %t |
| // RUN: %clang_cc1 -extract-api --pretty-sgf --emit-sgf-symbol-labels-for-testing \ |
| // RUN: -x objective-c-header -triple arm64-apple-macosx %s -o %t/output.symbols.json -verify |
| |
| @class NSString; |
| @protocol NSCopying |
| @end |
| |
| // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix RET_NULLABLE |
| NSString *_Nullable returnsNullable(void); |
| // RET_NULLABLE-LABEL: "!testLabel": "c:@F@returnsNullable" |
| // RET_NULLABLE: "declarationFragments": [ |
| // RET_NULLABLE-NEXT: { |
| // RET_NULLABLE-NEXT: "kind": "typeIdentifier", |
| // RET_NULLABLE-NEXT: "preciseIdentifier": "c:objc(cs)NSString", |
| // RET_NULLABLE-NEXT: "spelling": "NSString" |
| // RET_NULLABLE-NEXT: }, |
| // RET_NULLABLE-NEXT: { |
| // RET_NULLABLE-NEXT: "kind": "text", |
| // RET_NULLABLE-NEXT: "spelling": " * " |
| // RET_NULLABLE-NEXT: }, |
| // RET_NULLABLE-NEXT: { |
| // RET_NULLABLE-NEXT: "kind": "keyword", |
| // RET_NULLABLE-NEXT: "spelling": "_Nullable" |
| // RET_NULLABLE-NEXT: }, |
| // RET_NULLABLE-NEXT: { |
| // RET_NULLABLE-NEXT: "kind": "text", |
| // RET_NULLABLE-NEXT: "spelling": " " |
| // RET_NULLABLE-NEXT: }, |
| // RET_NULLABLE-NEXT: { |
| // RET_NULLABLE-NEXT: "kind": "identifier", |
| // RET_NULLABLE-NEXT: "spelling": "returnsNullable" |
| // RET_NULLABLE-NEXT: }, |
| |
| // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix PARAM_NONNULL |
| void takesNonnull(NSString *_Nonnull s); |
| // PARAM_NONNULL-LABEL: "!testLabel": "c:@F@takesNonnull" |
| // PARAM_NONNULL: "declarationFragments": [ |
| // PARAM_NONNULL: { |
| // PARAM_NONNULL: "kind": "typeIdentifier", |
| // PARAM_NONNULL: "preciseIdentifier": "c:objc(cs)NSString", |
| // PARAM_NONNULL: "spelling": "NSString" |
| // PARAM_NONNULL-NEXT: }, |
| // PARAM_NONNULL-NEXT: { |
| // PARAM_NONNULL-NEXT: "kind": "text", |
| // PARAM_NONNULL-NEXT: "spelling": " * " |
| // PARAM_NONNULL-NEXT: }, |
| // PARAM_NONNULL-NEXT: { |
| // PARAM_NONNULL-NEXT: "kind": "keyword", |
| // PARAM_NONNULL-NEXT: "spelling": "_Nonnull" |
| // PARAM_NONNULL-NEXT: }, |
| // PARAM_NONNULL-NEXT: { |
| // PARAM_NONNULL-NEXT: "kind": "text", |
| // PARAM_NONNULL-NEXT: "spelling": " " |
| // PARAM_NONNULL-NEXT: }, |
| // PARAM_NONNULL-NEXT: { |
| // PARAM_NONNULL-NEXT: "kind": "internalParam", |
| // PARAM_NONNULL-NEXT: "spelling": "s" |
| // PARAM_NONNULL-NEXT: }, |
| |
| // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix PLAIN_C |
| int *_Nullable plainCPointer(int *_Nonnull p); |
| // PLAIN_C-LABEL: "!testLabel": "c:@F@plainCPointer" |
| // PLAIN_C: "declarationFragments": [ |
| // PLAIN_C: { |
| // PLAIN_C: "kind": "typeIdentifier", |
| // PLAIN_C: "spelling": "int" |
| // PLAIN_C-NEXT: }, |
| // PLAIN_C-NEXT: { |
| // PLAIN_C-NEXT: "kind": "text", |
| // PLAIN_C-NEXT: "spelling": " * " |
| // PLAIN_C-NEXT: }, |
| // PLAIN_C-NEXT: { |
| // PLAIN_C-NEXT: "kind": "keyword", |
| // PLAIN_C-NEXT: "spelling": "_Nullable" |
| // PLAIN_C-NEXT: }, |
| |
| // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix NULL_UNSPEC |
| void nullUnspec(NSString *_Null_unspecified s); |
| // NULL_UNSPEC-LABEL: "!testLabel": "c:@F@nullUnspec" |
| // NULL_UNSPEC: "declarationFragments": [ |
| // NULL_UNSPEC: { |
| // NULL_UNSPEC: "kind": "keyword", |
| // NULL_UNSPEC: "spelling": "_Null_unspecified" |
| // NULL_UNSPEC-NEXT: }, |
| |
| // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix ID_NULLABLE |
| void takesIdNullable(id _Nullable obj); |
| // ID_NULLABLE-LABEL: "!testLabel": "c:@F@takesIdNullable" |
| // ID_NULLABLE: "declarationFragments": [ |
| // ID_NULLABLE: { |
| // ID_NULLABLE: "kind": "keyword", |
| // ID_NULLABLE: "spelling": "id" |
| // ID_NULLABLE-NEXT: }, |
| // ID_NULLABLE-NEXT: { |
| // ID_NULLABLE-NEXT: "kind": "text", |
| // ID_NULLABLE-NEXT: "spelling": " " |
| // ID_NULLABLE-NEXT: }, |
| // ID_NULLABLE-NEXT: { |
| // ID_NULLABLE-NEXT: "kind": "keyword", |
| // ID_NULLABLE-NEXT: "spelling": "_Nullable" |
| // ID_NULLABLE-NEXT: }, |
| |
| // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix ID_PROTO |
| void takesIdProto(id<NSCopying> _Nullable obj); |
| // ID_PROTO-LABEL: "!testLabel": "c:@F@takesIdProto" |
| // ID_PROTO: "declarationFragments": [ |
| // ID_PROTO: { |
| // ID_PROTO: "kind": "typeIdentifier", |
| // ID_PROTO: "preciseIdentifier": "c:Qoobjc(pl)NSCopying", |
| // ID_PROTO: "spelling": "id<NSCopying>" |
| // ID_PROTO-NEXT: }, |
| // ID_PROTO-NEXT: { |
| // ID_PROTO-NEXT: "kind": "text", |
| // ID_PROTO-NEXT: "spelling": " " |
| // ID_PROTO-NEXT: }, |
| // ID_PROTO-NEXT: { |
| // ID_PROTO-NEXT: "kind": "keyword", |
| // ID_PROTO-NEXT: "spelling": "_Nullable" |
| // ID_PROTO-NEXT: }, |
| |
| // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix ASSUME_NN |
| _Pragma("clang assume_nonnull begin") |
| NSString *implicitlyNonnull(NSString *s); |
| _Pragma("clang assume_nonnull end") |
| // ASSUME_NN-LABEL: "!testLabel": "c:@F@implicitlyNonnull" |
| // ASSUME_NN: "declarationFragments": [ |
| // ASSUME_NN: { |
| // ASSUME_NN: "kind": "typeIdentifier", |
| // ASSUME_NN: "preciseIdentifier": "c:objc(cs)NSString", |
| // ASSUME_NN: "spelling": "NSString" |
| // ASSUME_NN-NEXT: }, |
| // ASSUME_NN-NEXT: { |
| // ASSUME_NN-NEXT: "kind": "text", |
| // ASSUME_NN-NEXT: "spelling": " * " |
| // ASSUME_NN-NEXT: }, |
| // ASSUME_NN-NEXT: { |
| // ASSUME_NN-NEXT: "kind": "keyword", |
| // ASSUME_NN-NEXT: "spelling": "_Nonnull" |
| // ASSUME_NN-NEXT: }, |
| |
| // expected-no-diagnostics |