Skip to content

Commit 49aaede

Browse files
committed
RequirementMachine: Fix RewriteStep::AdjustConcreteType
Using StartOffset to encode the prefix length is wrong, because then we get an invalid rewrite step after replaceRuleWithPath(). Instead, encode the prefix length in the RuleID field.
1 parent 5ac83e2 commit 49aaede

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

lib/AST/RequirementMachine/RewriteLoop.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,27 +105,27 @@ MutableTerm RewriteStep::applyAdjustment(RewritePathEvaluator &evaluator,
105105
auto &term = evaluator.getCurrentTerm();
106106

107107
assert(Kind == AdjustConcreteType);
108-
assert(EndOffset == 0);
109-
assert(RuleID == 0);
110108

111109
auto &ctx = system.getRewriteContext();
112-
MutableTerm prefix(term.begin(), term.begin() + StartOffset);
110+
MutableTerm prefix(term.begin() + StartOffset,
111+
term.begin() + StartOffset + RuleID);
113112

114113
// We're either adding or removing the prefix to each concrete substitution.
115114
term.back() = term.back().transformConcreteSubstitutions(
116115
[&](Term t) -> Term {
117116
if (Inverse) {
118117
if (!std::equal(t.begin(),
119-
t.begin() + StartOffset,
118+
t.begin() + RuleID,
120119
prefix.begin())) {
121120
llvm::errs() << "Invalid rewrite path\n";
122121
llvm::errs() << "- Term: " << term << "\n";
122+
llvm::errs() << "- Substitution: " << t << "\n";
123123
llvm::errs() << "- Start offset: " << StartOffset << "\n";
124124
llvm::errs() << "- Expected subterm: " << prefix << "\n";
125125
abort();
126126
}
127127

128-
MutableTerm mutTerm(t.begin() + StartOffset, t.end());
128+
MutableTerm mutTerm(t.begin() + RuleID, t.end());
129129
return Term::get(mutTerm, ctx);
130130
} else {
131131
MutableTerm mutTerm(prefix);
@@ -160,7 +160,6 @@ void RewriteStep::applyShift(RewritePathEvaluator &evaluator,
160160
void RewriteStep::applyDecompose(RewritePathEvaluator &evaluator,
161161
const RewriteSystem &system) const {
162162
assert(Kind == Decompose);
163-
assert(StartOffset == 0);
164163
assert(EndOffset == 0);
165164

166165
auto &ctx = system.getRewriteContext();
@@ -332,4 +331,3 @@ void RewriteLoop::dump(llvm::raw_ostream &out,
332331
if (isDeleted())
333332
out << " [deleted]";
334333
}
335-

lib/AST/RequirementMachine/RewriteLoop.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ struct RewriteStep {
130130

131131
/// If Kind is ApplyRewriteRule, the index of the rule in the rewrite system.
132132
///
133+
/// If Kind is AdjustConcreteType, the length of the prefix to add or remove
134+
/// at the beginning of each concrete substitution.
135+
///
133136
/// If Kind is Concrete, the number of substitutions to push or pop.
134137
unsigned RuleID : 15;
135138

@@ -156,8 +159,8 @@ struct RewriteStep {
156159
}
157160

158161
static RewriteStep forAdjustment(unsigned offset, bool inverse) {
159-
return RewriteStep(AdjustConcreteType, offset, /*endOffset=*/0,
160-
/*ruleID=*/0, inverse);
162+
return RewriteStep(AdjustConcreteType, /*startOffset=*/0, /*endOffset=*/0,
163+
/*ruleID=*/offset, inverse);
161164
}
162165

163166
static RewriteStep forShift(bool inverse) {

0 commit comments

Comments
 (0)