Skip to content

Commit 6378c3e

Browse files
author
Marc Rasi
committed
fix SourceLoc-related crasher and add tests
1 parent 2492850 commit 6378c3e

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

lib/Sema/DerivedConformanceDifferentiable.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -725,10 +725,12 @@ getOrSynthesizeTangentVectorStruct(DerivedConformance &derived, Identifier id) {
725725
SmallVector<VarDecl *, 8> diffProperties;
726726
getStoredPropertiesForDifferentiation(nominal, parentDC, diffProperties);
727727

728+
auto synthesizedLoc = derived.ConformanceDecl->getEndLoc();
728729
auto *structDecl =
729-
new (C) StructDecl(SourceLoc(), C.Id_TangentVector, SourceLoc(),
730+
new (C) StructDecl(synthesizedLoc, C.Id_TangentVector, synthesizedLoc,
730731
/*Inherited*/ C.AllocateCopy(tvDesiredProtoTypeLocs),
731732
/*GenericParams*/ {}, parentDC);
733+
structDecl->setBraces({synthesizedLoc, synthesizedLoc});
732734
structDecl->setImplicit();
733735
structDecl->copyFormalAccessFrom(nominal, /*sourceIsParentContext*/ true);
734736

test/AutoDiff/Sema/DerivedConformances/derived_differentiable.swift

+21
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,24 @@ extension AutoDeriveEncodableTV2: TangentVectorMustBeEncodable {}
135135

136136
// CHECK-AST-LABEL: extension AutoDeriveEncodableTV2 : TangentVectorMustBeEncodable {
137137
// CHECK-AST: internal struct TangentVector : {{(Encodable, Differentiable, AdditiveArithmetic)|(Encodable, AdditiveArithmetic, Differentiable)|(Differentiable, Encodable, AdditiveArithmetic)|(AdditiveArithmetic, Encodable, Differentiable)|(Differentiable, AdditiveArithmetic, Encodable)|(AdditiveArithmetic, Differentiable, Encodable)}} {
138+
139+
protocol TangentVectorP: Differentiable {
140+
var requirement: Int { get }
141+
}
142+
143+
protocol TangentVectorConstrained: Differentiable where TangentVector: TangentVectorP {}
144+
145+
struct StructWithTangentVectorConstrained: TangentVectorConstrained {
146+
var x: Float
147+
}
148+
149+
// `extension StructWithTangentVectorConstrained.TangentVector: TangentVectorP` gives
150+
// "error: type 'StructWithTangentVectorConstrained.TangentVector' does not conform to protocol 'TangentVectorP'",
151+
// maybe because it typechecks the conformance before seeing the extension. But this roundabout way
152+
// of stating the same thing works.
153+
extension TangentVectorP where Self == StructWithTangentVectorConstrained.TangentVector {
154+
var requirement: Int { 42 }
155+
}
156+
157+
// CHECK-AST-LABEL: internal struct StructWithTangentVectorConstrained : TangentVectorConstrained {
158+
// CHECK-AST: internal struct TangentVector : {{(TangentVectorP, Differentiable, AdditiveArithmetic)|(TangentVectorP, AdditiveArithmetic, Differentiable)|(Differentiable, TangentVectorP, AdditiveArithmetic)|(AdditiveArithmetic, TangentVectorP, Differentiable)|(Differentiable, AdditiveArithmetic, TangentVectorP)|(AdditiveArithmetic, Differentiable, TangentVectorP)}} {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %target-swift-frontend -typecheck -verify %s
2+
3+
import _Differentiation
4+
5+
protocol TangentVectorP: Differentiable {
6+
// expected-note @+1 {{protocol requires property 'requirement' with type 'Int'; do you want to add a stub?}}
7+
var requirement: Int { get }
8+
}
9+
10+
protocol TangentVectorConstrained: Differentiable where TangentVector: TangentVectorP {}
11+
12+
struct StructWithTangentVectorConstrained: TangentVectorConstrained {
13+
var x: Float
14+
}
15+
// expected-error @-1 {{type 'StructWithTangentVectorConstrained.TangentVector' does not conform to protocol 'TangentVectorP'}}

0 commit comments

Comments
 (0)