Skip to content

Commit ffc501c

Browse files
committed
Sema: Fix crash with invalid @_opaqueReturnTypeOf attribute
If we demangle the name but we can't resolve the opaque return declaration, we would dereference a null pointer and crash. Speculative fix for rdar://161067984.
1 parent 8ad16fb commit ffc501c

File tree

3 files changed

+31
-25
lines changed

3 files changed

+31
-25
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4039,13 +4039,12 @@ TypeResolver::resolveOpaqueReturnType(TypeRepr *repr, StringRef mangledName,
40394039
builder.getNodeFactory().createNode(Node::Kind::OpaqueReturnTypeOf);
40404040
opaqueNode->addChild(definingDeclNode, builder.getNodeFactory());
40414041
auto *opaqueDecl = builder.resolveOpaqueTypeDecl(opaqueNode);
4042-
4043-
auto *ownerDecl = opaqueDecl->getNamingDecl();
4044-
if (!ownerDecl) {
4042+
if (!opaqueDecl) {
40454043
diagnose(repr->getLoc(), diag::no_opaque_return_type_of);
40464044
return ErrorType::get(getASTContext());
40474045
}
40484046

4047+
auto *ownerDecl = opaqueDecl->getNamingDecl();
40494048
auto genericSig = ownerDecl->getInnermostDeclContext()
40504049
->getGenericSignatureOfContext();
40514050

test/ModuleInterface/invalid-opaque-result-types.swift

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Test that we emit a diagnostic (and don't crash) when we cannot resolve
2+
// an opaque result type reference.
3+
//
4+
// RUN: %target-typecheck-verify-swift -module-name OpaqueTypes
5+
//
6+
7+
public struct G<T> {
8+
public func f() -> some Any
9+
}
10+
11+
// Type doesn't demangle
12+
public typealias Bad1 = @_opaqueReturnTypeOf("nonsense", 0) __
13+
// expected-error@-1 {{unable to resolve type for _opaqueReturnTypeOf attribute}}
14+
15+
// Type demangles but doesn't name an opaque return type
16+
public typealias Bad2 = @_opaqueReturnTypeOf("$sSi", 0) __
17+
// expected-error@-1 {{unable to resolve type for _opaqueReturnTypeOf attribute}}
18+
19+
// Bad index
20+
public typealias Bad3 = @_opaqueReturnTypeOf("$s11OpaqueTypes1GV1fQryF", 5) __<Int>
21+
// expected-error@-1 {{unable to resolve type for _opaqueReturnTypeOf attribute}}
22+
23+
// Bad generic argument
24+
public typealias Bad4 = @_opaqueReturnTypeOf("$s11OpaqueTypes1GV1fQryF", 0) __<InvalidType>
25+
// expected-error@-1 {{cannot find type 'InvalidType' in scope}}
26+
27+
// Missing generic argument
28+
public typealias Bad5 = @_opaqueReturnTypeOf("$s11OpaqueTypes1GV1fQryF", 0) __
29+
// expected-error@-1 {{unable to resolve type for _opaqueReturnTypeOf attribute}}

0 commit comments

Comments
 (0)