Skip to content

Commit c61910d

Browse files
authored
---
yaml --- r: 341723 b: refs/heads/rxwei-patch-1 c: a35ee51 h: refs/heads/master i: 341721: 0eee893 341719: 5d98fd0
1 parent 9a3aee7 commit c61910d

File tree

149 files changed

+1865
-1167
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

149 files changed

+1865
-1167
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: f27ccabdb156fd808cfb774f6e9243b32146109f
1018+
refs/heads/rxwei-patch-1: a35ee51502c887aeb40be85ac9cc39134644440d
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/docs/ABI/Mangling.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,7 @@ conformance within the witness table, identified by the dependent type and
717717
protocol. In all cases, the DEPENDENT-CONFORMANCE-INDEX is an INDEX value
718718
indicating the position of the appropriate value within the generic environment
719719
(for "HD") or witness table (for "HI" and "HA") when it is known to be at a
720-
fixed position. An index of 1 ("0_") is used to indicate "unknown"; all other
720+
fixed position. An index of 1 ("0\_") is used to indicate "unknown"; all other
721721
values are adjusted by 2. That these indexes are not 0-based is a bug that's
722722
now codified into the ABI; the index 0 is therefore reserved.
723723

branches/rxwei-patch-1/docs/SIL.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5110,13 +5110,15 @@ cond_fail
51105110
`````````
51115111
::
51125112

5113-
sil-instruction ::= 'cond_fail' sil-operand
5113+
sil-instruction ::= 'cond_fail' sil-operand, string-literal
51145114

5115-
cond_fail %0 : $Builtin.Int1
5115+
cond_fail %0 : $Builtin.Int1, "failure reason"
51165116
// %0 must be of type $Builtin.Int1
51175117

51185118
This instruction produces a `runtime failure`_ if the operand is one.
51195119
Execution proceeds normally if the operand is zero.
5120+
The second operand is a static failure message, which is displayed by the
5121+
debugger in case the failure is triggered.
51205122

51215123
Terminators
51225124
~~~~~~~~~~~

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#ifndef SWIFT_AST_ANYREQUEST_H
1818
#define SWIFT_AST_ANYREQUEST_H
1919

20+
#include "swift/Basic/SourceLoc.h"
2021
#include "swift/Basic/TypeID.h"
2122
#include "llvm/ADT/DenseMapInfo.h"
2223
#include "llvm/ADT/Hashing.h"
@@ -85,6 +86,9 @@ class AnyRequest {
8586

8687
/// Note that this request is part of a cycle.
8788
virtual void noteCycleStep(DiagnosticEngine &diags) const = 0;
89+
90+
/// Retrieve the nearest source location to which this request applies.
91+
virtual SourceLoc getNearestLoc() const = 0;
8892
};
8993

9094
/// Holds a value that can be used as a request input/output.
@@ -125,6 +129,11 @@ class AnyRequest {
125129
virtual void noteCycleStep(DiagnosticEngine &diags) const override {
126130
request.noteCycleStep(diags);
127131
}
132+
133+
/// Retrieve the nearest source location to which this request applies.
134+
virtual SourceLoc getNearestLoc() const override {
135+
return request.getNearestLoc();
136+
}
128137
};
129138

130139
/// FIXME: Inefficient. Use the low bits.
@@ -202,6 +211,11 @@ class AnyRequest {
202211
stored->noteCycleStep(diags);
203212
}
204213

214+
/// Retrieve the nearest source location to which this request applies.
215+
SourceLoc getNearestLoc() const {
216+
return stored->getNearestLoc();
217+
}
218+
205219
/// Compare two instances for equality.
206220
friend bool operator==(const AnyRequest &lhs, const AnyRequest &rhs) {
207221
if (lhs.storageKind != rhs.storageKind) {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,10 +314,6 @@ BUILTIN_SIL_OPERATION(BeginUnpairedModifyAccess, "beginUnpairedModifyAccess",
314314
/// be a pointer to an UnsafeValueBuffer that records an in progress access.
315315
BUILTIN_SIL_OPERATION(EndUnpairedAccess, "endUnpairedAccess", Special)
316316

317-
/// condfail(Int1) -> ()
318-
/// Triggers a runtime failure if the condition is true.
319-
BUILTIN_SIL_OPERATION(CondFail, "condfail", Special)
320-
321317
/// fixLifetime(T) -> ()
322318
/// Fixes the lifetime of any heap references in a value.
323319
BUILTIN_SIL_OPERATION(FixLifetime, "fixLifetime", Special)
@@ -404,6 +400,10 @@ BUILTIN_RUNTIME_CALL(IsOptionalType, "isOptional", "")
404400
BUILTIN(Id, Name, Attrs)
405401
#endif
406402

403+
/// condfail(Int1, RawPointer) -> ()
404+
/// Triggers a runtime failure if the condition is true.
405+
BUILTIN_MISC_OPERATION(CondFail, "condfail", "", Special)
406+
407407
/// Sizeof has type T.Type -> Int
408408
BUILTIN_MISC_OPERATION(Sizeof, "sizeof", "n", Special)
409409

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

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5615,7 +5615,7 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
56155615
}
56165616

56175617
struct BodySynthesizer {
5618-
void (* Fn)(AbstractFunctionDecl *, void *);
5618+
std::pair<BraceStmt *, bool> (* Fn)(AbstractFunctionDecl *, void *);
56195619
void *Context;
56205620
};
56215621

@@ -5748,18 +5748,8 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
57485748
/// have a body for this function.
57495749
///
57505750
/// \sa hasBody()
5751-
BraceStmt *getBody(bool canSynthesize = true) const {
5752-
if (canSynthesize && getBodyKind() == BodyKind::Synthesize) {
5753-
const_cast<AbstractFunctionDecl *>(this)->setBodyKind(BodyKind::None);
5754-
(Synthesizer.Fn)(const_cast<AbstractFunctionDecl *>(this),
5755-
Synthesizer.Context);
5756-
}
5757-
if (getBodyKind() == BodyKind::Parsed ||
5758-
getBodyKind() == BodyKind::TypeChecked) {
5759-
return Body;
5760-
}
5761-
return nullptr;
5762-
}
5751+
BraceStmt *getBody(bool canSynthesize = true) const;
5752+
57635753
void setBody(BraceStmt *S, BodyKind NewBodyKind = BodyKind::Parsed) {
57645754
assert(getBodyKind() != BodyKind::Skipped &&
57655755
"cannot set a body if it was skipped");
@@ -5784,8 +5774,12 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
57845774
}
57855775

57865776
/// Note that parsing for the body was delayed.
5787-
void setBodySynthesizer(void (* fn)(AbstractFunctionDecl *, void *),
5788-
void *context = nullptr) {
5777+
///
5778+
/// The function should return the body statement and a flag indicating
5779+
/// whether that body is already type-checked.
5780+
void setBodySynthesizer(
5781+
std::pair<BraceStmt *, bool> (* fn)(AbstractFunctionDecl *, void *),
5782+
void *context = nullptr) {
57895783
assert(getBodyKind() == BodyKind::None);
57905784
Synthesizer = {fn, context};
57915785
setBodyKind(BodyKind::Synthesize);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,10 +540,12 @@ namespace swift {
540540
/// Class responsible for formatting diagnostics and presenting them
541541
/// to the user.
542542
class DiagnosticEngine {
543+
public:
543544
/// The source manager used to interpret source locations and
544545
/// display diagnostics.
545546
SourceManager &SourceMgr;
546547

548+
private:
547549
/// The diagnostic consumer(s) that will be responsible for actually
548550
/// emitting diagnostics.
549551
SmallVector<DiagnosticConsumer *, 2> Consumers;

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,6 @@ class ObjectLiteralExpr final
11311131

11321132
private:
11331133
Expr *Arg;
1134-
Expr *SemanticExpr;
11351134
SourceLoc PoundLoc;
11361135
ConcreteDeclRef Initializer;
11371136

@@ -1181,9 +1180,6 @@ class ObjectLiteralExpr final
11811180
return Bits.ObjectLiteralExpr.HasTrailingClosure;
11821181
}
11831182

1184-
Expr *getSemanticExpr() const { return SemanticExpr; }
1185-
void setSemanticExpr(Expr *expr) { SemanticExpr = expr; }
1186-
11871183
SourceLoc getSourceLoc() const { return PoundLoc; }
11881184
SourceRange getSourceRange() const {
11891185
return SourceRange(PoundLoc, Arg->getEndLoc());

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ namespace detail {
113113

114114
/// Extract the first, nearest source location from a tuple.
115115
template<unsigned Index, typename ...Types,
116-
typename = typename std::enable_if<Index < sizeof...(Types)>::type>
116+
typename = typename std::enable_if<sizeof...(Types) - Index
117+
? true
118+
: false>::type>
117119
SourceLoc extractNearestSourceLocTuple(const std::tuple<Types...> &value) {
118120
SourceLoc loc = maybeExtractNearestSourceLoc(std::get<Index>(value));
119121
if (loc.isValid())

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,28 @@ class LazyStoragePropertyRequest :
689689
bool isCached() const { return true; }
690690
};
691691

692+
/// Request to type check the body of the given function.
693+
///
694+
/// Produces true if an error occurred, false otherwise.
695+
/// FIXME: it would be far better to return the type-checked body.
696+
class TypeCheckFunctionBodyRequest :
697+
public SimpleRequest<TypeCheckFunctionBodyRequest,
698+
bool(AbstractFunctionDecl *),
699+
CacheKind::Cached> {
700+
public:
701+
using SimpleRequest::SimpleRequest;
702+
703+
private:
704+
friend SimpleRequest;
705+
706+
// Evaluation.
707+
llvm::Expected<bool>
708+
evaluate(Evaluator &evaluator, AbstractFunctionDecl *func) const;
709+
710+
public:
711+
bool isCached() const { return true; }
712+
};
713+
692714
// Allow AnyValue to compare two Type values, even though Type doesn't
693715
// support ==.
694716
template<>

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,5 @@ SWIFT_TYPEID(SelfAccessKindRequest)
3939
SWIFT_TYPEID(IsGetterMutatingRequest)
4040
SWIFT_TYPEID(IsSetterMutatingRequest)
4141
SWIFT_TYPEID(OpaqueReadOwnershipRequest)
42-
SWIFT_TYPEID(LazyStoragePropertyRequest)
42+
SWIFT_TYPEID(LazyStoragePropertyRequest)
43+
SWIFT_TYPEID(TypeCheckFunctionBodyRequest)

branches/rxwei-patch-1/include/swift/Basic/NullablePtr.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,14 @@ class NullablePtr {
5555
assert(Ptr && "Pointer wasn't checked for null!");
5656
return Ptr;
5757
}
58-
59-
T *getPtrOrNull() { return Ptr; }
60-
const T *getPtrOrNull() const { return Ptr; }
58+
59+
T *getPtrOrNull() { return getPtrOr(nullptr); }
60+
const T *getPtrOrNull() const { return getPtrOr(nullptr); }
61+
62+
T *getPtrOr(T *defaultValue) { return Ptr ? Ptr : defaultValue; }
63+
const T *getPtrOr(const T *defaultValue) const {
64+
return Ptr ? Ptr : defaultValue;
65+
}
6166

6267
explicit operator bool() const { return Ptr; }
6368

branches/rxwei-patch-1/include/swift/SIL/SILBuilder.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1775,15 +1775,15 @@ class SILBuilder {
17751775
//===--------------------------------------------------------------------===//
17761776

17771777
CondFailInst *createCondFail(SILLocation Loc, SILValue Operand,
1778-
bool Inverted = false) {
1778+
StringRef Message, bool Inverted = false) {
17791779
if (Inverted) {
17801780
SILType Ty = Operand->getType();
17811781
SILValue True(createIntegerLiteral(Loc, Ty, 1));
17821782
Operand =
17831783
createBuiltinBinaryFunction(Loc, "xor", Ty, Ty, {Operand, True});
17841784
}
1785-
return insert(new (getModule())
1786-
CondFailInst(getSILDebugLocation(Loc), Operand));
1785+
return insert(CondFailInst::create(getSILDebugLocation(Loc), Operand,
1786+
Message, getModule()));
17871787
}
17881788

17891789
BuiltinInst *createBuiltinTrap(SILLocation Loc) {

branches/rxwei-patch-1/include/swift/SIL/SILCloner.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2447,7 +2447,8 @@ SILCloner<ImplClass>::visitCondFailInst(CondFailInst *Inst) {
24472447
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
24482448
recordClonedInstruction(
24492449
Inst, getBuilder().createCondFail(getOpLocation(Inst->getLoc()),
2450-
getOpValue(Inst->getOperand())));
2450+
getOpValue(Inst->getOperand()),
2451+
Inst->getMessage()));
24512452
}
24522453

24532454
template<typename ImplClass>

branches/rxwei-patch-1/include/swift/SIL/SILInstruction.h

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6715,14 +6715,28 @@ class ProjectExistentialBoxInst
67156715
//===----------------------------------------------------------------------===//
67166716

67176717
/// Trigger a runtime failure if the given Int1 value is true.
6718-
class CondFailInst
6718+
///
6719+
/// Optionally cond_fail has a static failure message, which is displayed in the debugger in case the failure
6720+
/// is triggered.
6721+
class CondFailInst final
67196722
: public UnaryInstructionBase<SILInstructionKind::CondFailInst,
6720-
NonValueInstruction>
6723+
NonValueInstruction>,
6724+
private llvm::TrailingObjects<CondFailInst, char>
67216725
{
6726+
friend TrailingObjects;
67226727
friend SILBuilder;
67236728

6724-
CondFailInst(SILDebugLocation DebugLoc, SILValue Operand)
6725-
: UnaryInstructionBase(DebugLoc, Operand) {}
6729+
unsigned MessageSize;
6730+
6731+
CondFailInst(SILDebugLocation DebugLoc, SILValue Operand, StringRef Message);
6732+
6733+
static CondFailInst *create(SILDebugLocation DebugLoc, SILValue Operand,
6734+
StringRef Message, SILModule &M);
6735+
6736+
public:
6737+
StringRef getMessage() const {
6738+
return {getTrailingObjects<char>(), MessageSize};
6739+
}
67266740
};
67276741

67286742
//===----------------------------------------------------------------------===//

branches/rxwei-patch-1/include/swift/Serialization/ModuleFormat.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5252
/// describe what change you made. The content of this comment isn't important;
5353
/// it just ensures a conflict if two people change the module format.
5454
/// Don't worry about adhering to the 80-column limit for this line.
55-
const uint16_t SWIFTMODULE_VERSION_MINOR = 500; // dependency types for protocols
55+
const uint16_t SWIFTMODULE_VERSION_MINOR = 501; // cond_fail messages
5656

5757
using DeclIDField = BCFixed<31>;
5858

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1977,7 +1977,6 @@ class PrintExpr : public ExprVisitor<PrintExpr> {
19771977
printArgumentLabels(E->getArgumentLabels());
19781978
OS << "\n";
19791979
printRec(E->getArg());
1980-
printSemanticExpr(E->getSemanticExpr());
19811980
PrintWithColorRAII(OS, ParenthesisColor) << ')';
19821981
}
19831982

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ SourceRange AbstractFunctionDeclScope::getChildlessSourceRange() const {
301301
assert(r.End.isValid());
302302
return r;
303303
}
304-
return decl->getBody()->getSourceRange();
304+
return decl->getBodySourceRange();
305305
}
306306

307307
SourceRange AbstractFunctionParamsScope::getChildlessSourceRange() const {

0 commit comments

Comments
 (0)