[flang] Address review comments.

Change AnalyzeArraySpec and AnalyzeCoarraySpec to return resulting
ArraySpec by value.

Original-commit: flang-compiler/f18@0ae38143e5
Reviewed-on: https://github.com/flang-compiler/f18/pull/384
This commit is contained in:
Tim Keith 2019-04-04 16:32:37 -07:00
parent b7efa8b77b
commit bc140ed13c
3 changed files with 22 additions and 22 deletions

View File

@ -167,16 +167,13 @@ static GenericKind MapIntrinsicOperator(IntrinsicOperator op) {
class ArraySpecAnalyzer {
public:
ArraySpecAnalyzer(ArraySpec &arraySpec, SemanticsContext &context)
: context_{context}, arraySpec_{arraySpec} {
CHECK(arraySpec.empty());
}
void Analyze(const parser::ArraySpec &);
void Analyze(const parser::CoarraySpec &);
ArraySpecAnalyzer(SemanticsContext &context) : context_{context} {}
ArraySpec Analyze(const parser::ArraySpec &);
ArraySpec Analyze(const parser::CoarraySpec &);
private:
SemanticsContext &context_;
ArraySpec &arraySpec_;
ArraySpec arraySpec_;
template<typename T> void Analyze(const std::list<T> &list) {
for (const auto &elem : list) {
@ -195,16 +192,16 @@ private:
Bound GetBound(const parser::SpecificationExpr &);
};
void AnalyzeArraySpec(ArraySpec &result, SemanticsContext &context,
const parser::ArraySpec &arraySpec) {
ArraySpecAnalyzer{result, context}.Analyze(arraySpec);
ArraySpec AnalyzeArraySpec(
SemanticsContext &context, const parser::ArraySpec &arraySpec) {
return ArraySpecAnalyzer{context}.Analyze(arraySpec);
}
void AnalyzeCoarraySpec(ArraySpec &result, SemanticsContext &context,
const parser::CoarraySpec &coarraySpec) {
ArraySpecAnalyzer{result, context}.Analyze(coarraySpec);
ArraySpec AnalyzeCoarraySpec(
SemanticsContext &context, const parser::CoarraySpec &coarraySpec) {
return ArraySpecAnalyzer{context}.Analyze(coarraySpec);
}
void ArraySpecAnalyzer::Analyze(const parser::ArraySpec &x) {
ArraySpec ArraySpecAnalyzer::Analyze(const parser::ArraySpec &x) {
std::visit(
common::visitors{
[&](const parser::DeferredShapeSpecList &y) { MakeDeferred(y.v); },
@ -216,8 +213,9 @@ void ArraySpecAnalyzer::Analyze(const parser::ArraySpec &x) {
[&](const auto &y) { Analyze(y); },
},
x.u);
return arraySpec_;
}
void ArraySpecAnalyzer::Analyze(const parser::CoarraySpec &x) {
ArraySpec ArraySpecAnalyzer::Analyze(const parser::CoarraySpec &x) {
std::visit(
common::visitors{
[&](const parser::DeferredCoshapeSpecList &y) { MakeDeferred(y.v); },
@ -228,6 +226,7 @@ void ArraySpecAnalyzer::Analyze(const parser::CoarraySpec &x) {
},
},
x.u);
return arraySpec_;
}
void ArraySpecAnalyzer::Analyze(const parser::AssumedShapeSpec &x) {

View File

@ -68,11 +68,10 @@ private:
void Analyze(const parser::GenericSpec &);
};
// Analyze a parser::ArraySpec or parser::CoarraySpec into the provide ArraySpec
void AnalyzeArraySpec(
ArraySpec &, SemanticsContext &, const parser::ArraySpec &);
void AnalyzeCoarraySpec(
ArraySpec &, SemanticsContext &, const parser::CoarraySpec &);
// Analyze a parser::ArraySpec or parser::CoarraySpec
ArraySpec AnalyzeArraySpec(SemanticsContext &, const parser::ArraySpec &);
ArraySpec AnalyzeCoarraySpec(
SemanticsContext &context, const parser::CoarraySpec &);
}

View File

@ -1419,10 +1419,12 @@ bool ImplicitRulesVisitor::HandleImplicitNone(
// ArraySpecVisitor implementation
void ArraySpecVisitor::Post(const parser::ArraySpec &x) {
AnalyzeArraySpec(arraySpec_, context(), x);
CHECK(arraySpec_.empty());
arraySpec_ = AnalyzeArraySpec(context(), x);
}
void ArraySpecVisitor::Post(const parser::CoarraySpec &x) {
AnalyzeCoarraySpec(coarraySpec_, context(), x);
CHECK(coarraySpec_.empty());
coarraySpec_ = AnalyzeCoarraySpec(context(), x);
}
const ArraySpec &ArraySpecVisitor::arraySpec() {