Skip to content

Commit 3d2f6ea

Browse files
committed
---
yaml --- r: 340855 b: refs/heads/rxwei-patch-1 c: 0ec33bf h: refs/heads/master i: 340853: c7ae1ed 340851: 375c883 340847: 58779b0
1 parent d69342b commit 3d2f6ea

File tree

7 files changed

+76
-13
lines changed

7 files changed

+76
-13
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ refs/tags/swift-DEVELOPMENT-SNAPSHOT-2018-08-18-a: b10b1fce14385faa6d44f6b933e95
10151015
refs/heads/rdar-43033749-fix-batch-mode-no-diags-swift-5.0-branch: a14e64eaad30de89f0f5f0b2a782eed7ecdcb255
10161016
refs/heads/revert-19006-error-bridging-integer-type: 8a9065a3696535305ea53fe9b71f91cbe6702019
10171017
refs/heads/revert-19050-revert-19006-error-bridging-integer-type: ecf752d54b05dd0a20f510f0bfa54a3fec3bcaca
1018-
refs/heads/rxwei-patch-1: 4df9543ee89fd64580a0f128db2b06dd03f7c09c
1018+
refs/heads/rxwei-patch-1: 0ec33bfa4ac8b6f2ad42090fe31258d8c3ce41bf
10191019
refs/heads/shahmishal-patch-1: e58ec0f7488258d42bef51bc3e6d7b3dc74d7b2a
10201020
refs/heads/typelist-existential: 4046359efd541fb5c72d69a92eefc0a784df8f5e
10211021
refs/tags/swift-4.2-DEVELOPMENT-SNAPSHOT-2018-08-20-a: 4319ba09e4fb8650ee86061075c74a016b6baab9

branches/rxwei-patch-1/include/swift/AST/Decl.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4384,6 +4384,7 @@ class AbstractStorageDecl : public ValueDecl {
43844384
friend class SetterAccessLevelRequest;
43854385
friend class IsGetterMutatingRequest;
43864386
friend class IsSetterMutatingRequest;
4387+
friend class OpaqueReadOwnershipRequest;
43874388

43884389
public:
43894390
static const size_t MaxNumAccessors = 255;
@@ -4457,6 +4458,8 @@ class AbstractStorageDecl : public ValueDecl {
44574458
unsigned IsGetterMutating : 1;
44584459
unsigned IsSetterMutatingComputed : 1;
44594460
unsigned IsSetterMutating : 1;
4461+
unsigned OpaqueReadOwnershipComputed : 1;
4462+
unsigned OpaqueReadOwnership : 2;
44604463
} LazySemanticInfo = { };
44614464

44624465
protected:
@@ -4466,8 +4469,6 @@ class AbstractStorageDecl : public ValueDecl {
44664469
: ValueDecl(Kind, DC, Name, NameLoc) {
44674470
Bits.AbstractStorageDecl.HasStorage = true;
44684471
Bits.AbstractStorageDecl.SupportsMutation = supportsMutation;
4469-
Bits.AbstractStorageDecl.OpaqueReadOwnership =
4470-
unsigned(OpaqueReadOwnership::Owned);
44714472
Bits.AbstractStorageDecl.IsStatic = IsStatic;
44724473
}
44734474

@@ -4551,11 +4552,10 @@ class AbstractStorageDecl : public ValueDecl {
45514552
}
45524553

45534554
/// Return the ownership of values opaquely read from this storage.
4554-
OpaqueReadOwnership getOpaqueReadOwnership() const {
4555-
return OpaqueReadOwnership(Bits.AbstractStorageDecl.OpaqueReadOwnership);
4556-
}
4555+
OpaqueReadOwnership getOpaqueReadOwnership() const;
45574556
void setOpaqueReadOwnership(OpaqueReadOwnership ownership) {
4558-
Bits.AbstractStorageDecl.OpaqueReadOwnership = unsigned(ownership);
4557+
LazySemanticInfo.OpaqueReadOwnership = unsigned(ownership);
4558+
LazySemanticInfo.OpaqueReadOwnershipComputed = true;
45594559
}
45604560

45614561
/// Return true if reading this storage requires the ability to

branches/rxwei-patch-1/include/swift/AST/TypeCheckRequests.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class TypeAliasDecl;
3737
struct TypeLoc;
3838
class ValueDecl;
3939
class AbstractStorageDecl;
40+
enum class OpaqueReadOwnership: uint8_t;
4041

4142
/// Display a nominal type or extension thereof.
4243
void simple_display(
@@ -754,6 +755,33 @@ class IsSetterMutatingRequest :
754755
void cacheResult(bool value) const;
755756
};
756757

758+
/// Request whether reading the storage yields a borrowed value.
759+
class OpaqueReadOwnershipRequest :
760+
public SimpleRequest<OpaqueReadOwnershipRequest,
761+
CacheKind::SeparatelyCached,
762+
OpaqueReadOwnership,
763+
AbstractStorageDecl *> {
764+
public:
765+
using SimpleRequest::SimpleRequest;
766+
767+
private:
768+
friend SimpleRequest;
769+
770+
// Evaluation.
771+
llvm::Expected<OpaqueReadOwnership>
772+
evaluate(Evaluator &evaluator, AbstractStorageDecl *storage) const;
773+
774+
public:
775+
// Cycle handling
776+
void diagnoseCycle(DiagnosticEngine &diags) const;
777+
void noteCycleStep(DiagnosticEngine &diags) const;
778+
779+
// Separate caching.
780+
bool isCached() const { return true; }
781+
Optional<OpaqueReadOwnership> getCachedResult() const;
782+
void cacheResult(OpaqueReadOwnership value) const;
783+
};
784+
757785
// Allow AnyValue to compare two Type values, even though Type doesn't
758786
// support ==.
759787
template<>

branches/rxwei-patch-1/include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,4 @@ SWIFT_TYPEID(FunctionBuilderTypeRequest)
3838
SWIFT_TYPEID(SelfAccessKindRequest)
3939
SWIFT_TYPEID(IsGetterMutatingRequest)
4040
SWIFT_TYPEID(IsSetterMutatingRequest)
41+
SWIFT_TYPEID(OpaqueReadOwnershipRequest)

branches/rxwei-patch-1/lib/AST/Decl.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2068,6 +2068,12 @@ bool AbstractStorageDecl::isSetterMutating() const {
20682068
IsSetterMutatingRequest{const_cast<AbstractStorageDecl *>(this)}, {});
20692069
}
20702070

2071+
OpaqueReadOwnership AbstractStorageDecl::getOpaqueReadOwnership() const {
2072+
ASTContext &ctx = getASTContext();
2073+
return evaluateOrDefault(ctx.evaluator,
2074+
OpaqueReadOwnershipRequest{const_cast<AbstractStorageDecl *>(this)}, {});
2075+
}
2076+
20712077
bool ValueDecl::isInstanceMember() const {
20722078
DeclContext *DC = getDeclContext();
20732079
if (!DC->isTypeContext())

branches/rxwei-patch-1/lib/AST/TypeCheckRequests.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -813,4 +813,31 @@ Optional<bool> IsSetterMutatingRequest::getCachedResult() const {
813813
void IsSetterMutatingRequest::cacheResult(bool value) const {
814814
auto *storage = std::get<0>(getStorage());
815815
storage->setIsSetterMutating(value);
816-
}
816+
}
817+
818+
//----------------------------------------------------------------------------//
819+
// OpaqueReadOwnershipRequest computation.
820+
//----------------------------------------------------------------------------//
821+
822+
void OpaqueReadOwnershipRequest::diagnoseCycle(DiagnosticEngine &diags) const {
823+
auto decl = std::get<0>(getStorage());
824+
diags.diagnose(decl, diag::circular_reference);
825+
}
826+
827+
void OpaqueReadOwnershipRequest::noteCycleStep(DiagnosticEngine &diags) const {
828+
auto decl = std::get<0>(getStorage());
829+
diags.diagnose(decl, diag::circular_reference_through);
830+
}
831+
832+
Optional<OpaqueReadOwnership>
833+
OpaqueReadOwnershipRequest::getCachedResult() const {
834+
auto *storage = std::get<0>(getStorage());
835+
if (storage->LazySemanticInfo.OpaqueReadOwnershipComputed)
836+
return OpaqueReadOwnership(storage->LazySemanticInfo.OpaqueReadOwnership);
837+
return None;
838+
}
839+
840+
void OpaqueReadOwnershipRequest::cacheResult(OpaqueReadOwnership value) const {
841+
auto *storage = std::get<0>(getStorage());
842+
storage->setOpaqueReadOwnership(value);
843+
}

branches/rxwei-patch-1/lib/Sema/TypeCheckDecl.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2118,8 +2118,12 @@ IsSetterMutatingRequest::evaluate(Evaluator &evaluator,
21182118
llvm_unreachable("bad storage kind");
21192119
}
21202120

2121-
static bool shouldUseOpaqueReadAccessor(AbstractStorageDecl *storage) {
2122-
return storage->getAttrs().hasAttribute<BorrowedAttr>();
2121+
llvm::Expected<OpaqueReadOwnership>
2122+
OpaqueReadOwnershipRequest::evaluate(Evaluator &evaluator,
2123+
AbstractStorageDecl *storage) const {
2124+
return (storage->getAttrs().hasAttribute<BorrowedAttr>()
2125+
? OpaqueReadOwnership::Borrowed
2126+
: OpaqueReadOwnership::Owned);
21232127
}
21242128

21252129
static void validateAbstractStorageDecl(TypeChecker &TC,
@@ -2129,9 +2133,6 @@ static void validateAbstractStorageDecl(TypeChecker &TC,
21292133
sf->markDeclWithOpaqueResultTypeAsValidated(storage);
21302134
}
21312135
}
2132-
2133-
if (shouldUseOpaqueReadAccessor(storage))
2134-
storage->setOpaqueReadOwnership(OpaqueReadOwnership::Borrowed);
21352136

21362137
// Everything else about the accessors can wait until finalization.
21372138
// This will validate all the accessors.

0 commit comments

Comments
 (0)