23
23
#include " swift/AST/Type.h"
24
24
#include " llvm/ADT/ArrayRef.h"
25
25
#include " llvm/ADT/SmallVector.h"
26
+ #include " llvm/Support/TrailingObjects.h"
26
27
27
28
namespace llvm {
28
29
class raw_ostream ;
@@ -198,15 +199,26 @@ class MarkExplicitlyEscaping final : public ConstraintFix {
198
199
199
200
// / Arguments have labeling failures - missing/extraneous or incorrect
200
201
// / labels attached to the, fix it by suggesting proper labels.
201
- class RelabelArguments final : public ConstraintFix {
202
- llvm::SmallVector<Identifier, 4 > CorrectLabels;
202
+ class RelabelArguments final
203
+ : public ConstraintFix,
204
+ private llvm::TrailingObjects<RelabelArguments, Identifier> {
205
+ friend TrailingObjects;
206
+
207
+ unsigned NumLabels;
203
208
204
209
RelabelArguments (llvm::ArrayRef<Identifier> correctLabels,
205
210
ConstraintLocator *locator)
206
211
: ConstraintFix(FixKind::RelabelArguments, locator),
207
- CorrectLabels (correctLabels.begin(), correctLabels.end()) {}
212
+ NumLabels (correctLabels.size()) {
213
+ std::uninitialized_copy (correctLabels.begin (), correctLabels.end (),
214
+ getLabelsBuffer ().begin ());
215
+ }
208
216
209
217
public:
218
+ ArrayRef<Identifier> getLabels () const {
219
+ return {getTrailingObjects<Identifier>(), NumLabels};
220
+ }
221
+
210
222
bool diagnose (Expr *root, const Solution &solution) const override ;
211
223
void print (llvm::raw_ostream &Out) const override {
212
224
Out << " [fix: re-label argument(s)]" ;
@@ -215,6 +227,11 @@ class RelabelArguments final : public ConstraintFix {
215
227
static RelabelArguments *create (ConstraintSystem &cs,
216
228
llvm::ArrayRef<Identifier> correctLabels,
217
229
ConstraintLocator *locator);
230
+
231
+ private:
232
+ MutableArrayRef<Identifier> getLabelsBuffer () {
233
+ return {getTrailingObjects<Identifier>(), NumLabels};
234
+ }
218
235
};
219
236
220
237
// / Add a new conformance to the type to satisfy a requirement.
0 commit comments