mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
A recent PR (#77204) started to import C++ source locations into Swift. This PR flips a switch so these locations are actually used more widely. Now some of the diagnostic locations are changed, but they generally improved the quality of the diagnostics, pointing out conformances imported from Obj-C code right when they are declared.
55 lines
1.8 KiB
Swift
55 lines
1.8 KiB
Swift
// RUN: rm -rf %t
|
|
// RUN: split-file %s %t
|
|
// RUN: not %target-swift-frontend -typecheck -I %swift_src_root/lib/ClangImporter/SwiftBridging -I %t/Inputs %t/test.swift -enable-experimental-feature NonescapableTypes -cxx-interoperability-mode=default -diagnostic-style llvm 2>&1 | %FileCheck %s
|
|
|
|
//--- Inputs/module.modulemap
|
|
module Test {
|
|
header "nonescapable.h"
|
|
requires cplusplus
|
|
}
|
|
|
|
//--- Inputs/nonescapable.h
|
|
#include "swift/bridging"
|
|
|
|
struct SWIFT_NONESCAPABLE View {
|
|
View() : member(nullptr) {}
|
|
View(const int *p [[clang::lifetimebound]]) : member(p) {}
|
|
View(const View&) = default;
|
|
private:
|
|
const int *member;
|
|
};
|
|
|
|
struct SWIFT_ESCAPABLE Owner {
|
|
int data;
|
|
};
|
|
|
|
Owner f(int* x [[clang::lifetimebound]]) {
|
|
return Owner{0};
|
|
}
|
|
|
|
Owner f2(int* x [[clang::lifetimebound]], int* y [[clang::lifetimebound]]) {
|
|
return Owner{0};
|
|
}
|
|
|
|
View g(int* x) {
|
|
return View(x);
|
|
}
|
|
|
|
//--- test.swift
|
|
|
|
import Test
|
|
|
|
// CHECK: error: cannot infer lifetime dependence, no parameters found that are either ~Escapable or Escapable with a borrowing ownership
|
|
public func noAnnotations() -> View {
|
|
// CHECK: nonescapable.h:15:7: warning: the returned type 'Owner' is annotated as escapable; it cannot have lifetime dependencies
|
|
f(nil)
|
|
// CHECK: nonescapable.h:19:7: warning: the returned type 'Owner' is annotated as escapable; it cannot have lifetime dependencies
|
|
// No duplicate warning for f2:
|
|
// CHECK-NOT: nonescapable.h:19
|
|
f2(nil, nil)
|
|
// CHECK: nonescapable.h:23:6: warning: the returned type 'View' is annotated as non-escapable; its lifetime dependencies must be annotated
|
|
// CHECKL nonescapable.h:23:6: error: cannot infer lifetime dependence, no parameters found that are either ~Escapable or Escapable with a borrowing ownership
|
|
g(nil)
|
|
return View()
|
|
}
|