mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Expose Substitution's archetype, replacement, and conformances only through getters so we can actually assert invariants about them. To start, require replacement types to be materializable in order to catch cases where the type-checker tries to bind type variables to lvalue or inout types, and require the conformance array to match the number of protocol conformances required by the archetype. This exposes some latent bugs in the test suite I've marked as failures for now: - test/Constraints/overload.swift was quietly suffering from <rdar://problem/17507421>, but we didn't notice because we never tried to codegen it. - test/SIL/Parser/array_roundtrip.swift doesn't correctly roundtrip substitutions, which I filed as <rdar://problem/17781140>. Swift SVN r20418
58 lines
1.9 KiB
C++
58 lines
1.9 KiB
C++
//===--- ConcreteDeclRef.cpp - Reference to a concrete decl -----*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See http://swift.org/LICENSE.txt for license information
|
|
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the ConcreteDeclRef class, which provides a reference to
|
|
// a declaration that is potentially specialized.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/AST/ASTContext.h"
|
|
#include "swift/AST/ConcreteDeclRef.h"
|
|
#include "swift/AST/Decl.h"
|
|
#include "swift/AST/Types.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
using namespace swift;
|
|
|
|
ConcreteDeclRef::SpecializedDeclRef *
|
|
ConcreteDeclRef::SpecializedDeclRef::create(
|
|
ASTContext &ctx, ValueDecl *decl,
|
|
ArrayRef<Substitution> substitutions) {
|
|
unsigned size = sizeof(SpecializedDeclRef)
|
|
+ sizeof(Substitution) * substitutions.size();
|
|
void *memory = ctx.Allocate(size, alignof(SpecializedDeclRef));
|
|
return new (memory) SpecializedDeclRef(decl, substitutions);
|
|
}
|
|
|
|
void ConcreteDeclRef::dump(raw_ostream &os) {
|
|
getDecl()->dumpRef(os);
|
|
|
|
// If specialized, dump the substitutions.
|
|
if (isSpecialized()) {
|
|
os << " [with ";
|
|
bool isFirst = true;
|
|
for (const auto &sub : getSubstitutions()) {
|
|
if (isFirst) {
|
|
isFirst = false;
|
|
} else {
|
|
os << ", ";
|
|
}
|
|
|
|
os << sub.getArchetype()->getFullName()
|
|
<< "=" << sub.getReplacement().getString();
|
|
}
|
|
os << ']';
|
|
}
|
|
}
|
|
|
|
void ConcreteDeclRef::dump() {
|
|
dump(llvm::errs());
|
|
}
|