From 1c5f9bc26e2da4ebd0473e2b7deccd08ba6528e2 Mon Sep 17 00:00:00 2001 From: Arnold Schwaighofer Date: Fri, 4 Feb 2022 16:27:38 -0800 Subject: [PATCH] IRGen: Emit the protocol requirement descriptor async flag for initializers rdar://88180938 --- lib/IRGen/GenMeta.cpp | 8 ++++++-- test/IRGen/async/protocol_req_descriptor.swift | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/IRGen/async/protocol_req_descriptor.swift diff --git a/lib/IRGen/GenMeta.cpp b/lib/IRGen/GenMeta.cpp index bea6fe9941c3a..459508c943ffb 100644 --- a/lib/IRGen/GenMeta.cpp +++ b/lib/IRGen/GenMeta.cpp @@ -240,8 +240,12 @@ static bool needsForeignMetadataCompletionFunction(IRGenModule &IGM, template static Flags getMethodDescriptorFlags(ValueDecl *fn) { - if (isa(fn)) - return Flags(Flags::Kind::Init); // 'init' is considered static + if (isa(fn)) { + auto flags = Flags(Flags::Kind::Init); // 'init' is considered static + if (auto *afd = dyn_cast(fn)) + flags = flags.withIsAsync(afd->hasAsync()); + return flags; + } auto kind = [&] { auto accessor = dyn_cast(fn); diff --git a/test/IRGen/async/protocol_req_descriptor.swift b/test/IRGen/async/protocol_req_descriptor.swift new file mode 100644 index 0000000000000..bad544f55cc8a --- /dev/null +++ b/test/IRGen/async/protocol_req_descriptor.swift @@ -0,0 +1,14 @@ +// RUN: %target-swift-frontend -emit-ir -disable-availability-checking %s | %FileCheck -check-prefix CHECK -check-prefix CHECK-%target-cpu -check-prefix CHECK-%target-import-type %s +// REQUIRES: concurrency + +// Make sure that the protocol requirement descriptor includes the async flag. +// CHECK: @"$s23protocol_req_descriptor12RepoProtocolMp" = {{.*}}%swift.protocol_requirement { i32 34, i32 0 }, %swift.protocol_requirement { i32 49, i32 0 } }> +protocol RepoProtocol { + init() async + func run() async +} + +actor Impl: RepoProtocol { + init() async {} + func run() async {} +}