diff options
author | peter klausler <pklausler@nvidia.com> | 2020-07-01 11:45:38 -0700 |
---|---|---|
committer | peter klausler <pklausler@nvidia.com> | 2020-07-01 14:09:07 -0700 |
commit | 31e6cd28a5a8afeea4a7f89d54ccf87eaba9f76c (patch) | |
tree | 3d324f9a0c1fbcf6e0b98dc474d7d6ff3ae98ba8 /flang/lib/Semantics/resolve-names-utils.cpp | |
parent | cb8faaacb52c1c0f0b97379ac0e07a612c04c5ff (diff) | |
download | llvm-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.cpp | 14 |
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); |