aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Semantics/resolve-names-utils.cpp
diff options
context:
space:
mode:
authorpeter klausler <pklausler@nvidia.com>2020-07-01 11:45:38 -0700
committerpeter klausler <pklausler@nvidia.com>2020-07-01 14:09:07 -0700
commit31e6cd28a5a8afeea4a7f89d54ccf87eaba9f76c (patch)
tree3d324f9a0c1fbcf6e0b98dc474d7d6ff3ae98ba8 /flang/lib/Semantics/resolve-names-utils.cpp
parentcb8faaacb52c1c0f0b97379ac0e07a612c04c5ff (diff)
downloadllvm-31e6cd28a5a8afeea4a7f89d54ccf87eaba9f76c.zip
llvm-31e6cd28a5a8afeea4a7f89d54ccf87eaba9f76c.tar.gz
llvm-31e6cd28a5a8afeea4a7f89d54ccf87eaba9f76c.tar.bz2
[flang] Implement cross-set EQUIVALENCE impossibility checking
Implement cross-set EQUIVALENCE impossibility checking; fixes an infinite loop on an erroneous test. Also fix substring reference offset calculations in EQUIVALENCE discovered to be incorrect during testing. Reviewed By: tskeith Differential Revision: https://reviews.llvm.org/D82993
Diffstat (limited to 'flang/lib/Semantics/resolve-names-utils.cpp')
-rw-r--r--flang/lib/Semantics/resolve-names-utils.cpp14
1 files changed, 3 insertions, 11 deletions
diff --git a/flang/lib/Semantics/resolve-names-utils.cpp b/flang/lib/Semantics/resolve-names-utils.cpp
index 5564570..d6f0302 100644
--- a/flang/lib/Semantics/resolve-names-utils.cpp
+++ b/flang/lib/Semantics/resolve-names-utils.cpp
@@ -365,7 +365,8 @@ void EquivalenceSets::AddToSet(const parser::Designator &designator) {
}
}
auto substringStart{currObject_.substringStart};
- currSet_.emplace_back(symbol, subscripts, substringStart);
+ currSet_.emplace_back(
+ symbol, subscripts, substringStart, designator.source);
PropagateSaveAttr(currSet_.back(), currSet_);
}
currObject_ = {};
@@ -446,16 +447,7 @@ void EquivalenceSets::MergeInto(const parser::CharBlock &source,
EquivalenceSet &dst{sets_[dstIndex]};
PropagateSaveAttr(dst, src);
for (const auto &obj : src) {
- if (const auto *obj2{Find(dst, obj.symbol)}) {
- if (obj == *obj2) {
- continue; // already there
- }
- context_.Say(source,
- "'%s' and '%s' cannot have the same first storage unit"_err_en_US,
- obj2->AsFortran(), obj.AsFortran());
- } else {
- dst.push_back(obj);
- }
+ dst.push_back(obj);
objectToSet_[obj] = dstIndex;
}
PropagateSaveAttr(src, dst);