Skip to content

Commit 3a38989

Browse files
committed
---
yaml --- r: 344991 b: refs/heads/master c: 427a8ed h: refs/heads/master i: 344989: d3c2c5d 344987: 7b38ec2 344983: a3fb65d 344975: e03b865 344959: 8f47399
1 parent 6e15311 commit 3a38989

File tree

6 files changed

+143
-282
lines changed

6 files changed

+143
-282
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 99c36f7c6249b5246ae44c6284c7d43ce60d5027
2+
refs/heads/master: 427a8ed1358f53f00e1d96123b490913c7eaf651
33
refs/heads/master-next: 203b3026584ecad859eb328b2e12490099409cd5
44
refs/tags/osx-passed: b6b74147ef8a386f532cf9357a1bde006e552c54
55
refs/tags/swift-2.2-SNAPSHOT-2015-12-01-a: 6bb18e013c2284f2b45f5f84f2df2887dc0f7dea

trunk/include/swift/AST/TypeCheckRequests.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ namespace swift {
2929

3030
class GenericParamList;
3131
class RequirementRepr;
32+
class SpecializeAttr;
3233
struct TypeLoc;
3334

3435
/// Display a nominal type or extension thereof.
@@ -220,22 +221,27 @@ struct WhereClauseOwner {
220221

221222
/// The source of the where clause, which can be a generic parameter list
222223
/// or a declaration that can have a where clause.
223-
llvm::PointerUnion<GenericParamList *, Decl *> source;
224+
llvm::PointerUnion3<GenericParamList *, Decl *, SpecializeAttr *> source;
224225

225226
WhereClauseOwner(Decl *decl);
226227

227228
WhereClauseOwner(DeclContext *dc, GenericParamList *genericParams)
228229
: dc(dc), source(genericParams) { }
229230

231+
WhereClauseOwner(DeclContext *dc, SpecializeAttr *attr)
232+
: dc(dc), source(attr) { }
233+
230234
SourceLoc getLoc() const;
231235

232236
friend hash_code hash_value(const WhereClauseOwner &owner) {
233-
return hash_combine(hash_value(owner.dc), hash_value(owner.source));
237+
return hash_combine(hash_value(owner.dc),
238+
hash_value(owner.source.getOpaqueValue()));
234239
}
235240

236241
friend bool operator==(const WhereClauseOwner &lhs,
237242
const WhereClauseOwner &rhs) {
238-
return lhs.dc == rhs.dc && lhs.source == rhs.source;
243+
return lhs.dc == rhs.dc &&
244+
lhs.source.getOpaqueValue() == rhs.source.getOpaqueValue();
239245
}
240246

241247
friend bool operator!=(const WhereClauseOwner &lhs,

trunk/lib/AST/TypeCheckRequests.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,13 +259,18 @@ SourceLoc WhereClauseOwner::getLoc() const {
259259
if (auto decl = source.dyn_cast<Decl *>())
260260
return decl->getLoc();
261261

262+
if (auto attr = source.dyn_cast<SpecializeAttr *>())
263+
return attr->getLocation();
264+
262265
return source.get<GenericParamList *>()->getWhereLoc();
263266
}
264267

265268
void swift::simple_display(llvm::raw_ostream &out,
266269
const WhereClauseOwner &owner) {
267270
if (auto decl = owner.source.dyn_cast<Decl *>()) {
268271
simple_display(out, decl);
272+
} else if (owner.source.is<SpecializeAttr *>()) {
273+
out << "@_specialize";
269274
} else {
270275
out << "(SIL generic parameter list)";
271276
}
@@ -289,6 +294,13 @@ RequirementRequest::getRequirements(WhereClauseOwner owner) {
289294
return genericParams->getRequirements();
290295
}
291296

297+
if (auto attr = owner.source.dyn_cast<SpecializeAttr *>()) {
298+
if (auto whereClause = attr->getTrailingWhereClause())
299+
return whereClause->getRequirements();
300+
301+
return { };
302+
}
303+
292304
auto decl = owner.source.dyn_cast<Decl *>();
293305
if (!decl)
294306
return { };

0 commit comments

Comments
 (0)