Skip to content

Commit e0bffe1

Browse files
authored
[flang][NFC] Use parser::Unwrap(Ref) more (#162918)
Replace more parse tree references to "thing" and "value()" with usage of the parser::Unwrap<> template function. Add parser::UnwrapRef<> as an alias for DEREF(Unwrap<>()).
1 parent 309fc11 commit e0bffe1

16 files changed

+119
-85
lines changed

flang/include/flang/Parser/tools.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@ template <typename A, typename B> const A *Unwrap(const B &x) {
117117
template <typename A, typename B> A *Unwrap(B &x) {
118118
return const_cast<A *>(Unwrap<A, B>(const_cast<const B &>(x)));
119119
}
120+
template <typename A, typename B> const A &UnwrapRef(const B &x) {
121+
return DEREF(Unwrap<A>(x));
122+
}
123+
template <typename A, typename B> A &UnwrapRef(B &x) {
124+
return DEREF(Unwrap<A>(x));
125+
}
120126

121127
// Get the CoindexedNamedObject if the entity is a coindexed object.
122128
const CoindexedNamedObject *GetCoindexedNamedObject(const AllocateObject &);

flang/lib/Lower/IO.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,8 @@ static void genIoLoop(Fortran::lower::AbstractConverter &converter,
950950
makeNextConditionalOn(builder, loc, checkResult, ok, inLoop);
951951
const auto &itemList = std::get<0>(ioImpliedDo.t);
952952
const auto &control = std::get<1>(ioImpliedDo.t);
953-
const auto &loopSym = *control.name.thing.thing.symbol;
953+
const auto &loopSym =
954+
*Fortran::parser::UnwrapRef<Fortran::parser::Name>(control.name).symbol;
954955
mlir::Value loopVar = fir::getBase(converter.genExprAddr(
955956
Fortran::evaluate::AsGenericExpr(loopSym).value(), stmtCtx));
956957
auto genControlValue = [&](const Fortran::parser::ScalarIntExpr &expr) {

flang/lib/Parser/parse-tree.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ StructureConstructor ArrayElement::ConvertToStructureConstructor(
185185
std::list<ComponentSpec> components;
186186
for (auto &subscript : subscripts) {
187187
components.emplace_back(std::optional<Keyword>{},
188-
ComponentDataSource{std::move(*Unwrap<Expr>(subscript))});
188+
ComponentDataSource{std::move(UnwrapRef<Expr>(subscript))});
189189
}
190190
DerivedTypeSpec spec{std::move(name), std::list<TypeParamSpec>{}};
191191
spec.derivedTypeSpec = &derived;

flang/lib/Semantics/assignment.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ void AssignmentContext::CheckShape(parser::CharBlock at, const SomeExpr *expr) {
194194

195195
template <typename A> void AssignmentContext::PushWhereContext(const A &x) {
196196
const auto &expr{std::get<parser::LogicalExpr>(x.t)};
197-
CheckShape(expr.thing.value().source, GetExpr(context_, expr));
197+
CheckShape(
198+
parser::UnwrapRef<parser::Expr>(expr).source, GetExpr(context_, expr));
198199
++whereDepth_;
199200
}
200201

flang/lib/Semantics/check-allocate.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,9 @@ static std::optional<AllocateCheckerInfo> CheckAllocateOptions(
151151
[&](const parser::MsgVariable &var) {
152152
WarnOnDeferredLengthCharacterScalar(context,
153153
GetExpr(context, var),
154-
var.v.thing.thing.GetSource(), "ERRMSG=");
154+
parser::UnwrapRef<parser::Variable>(var)
155+
.GetSource(),
156+
"ERRMSG=");
155157
if (info.gotMsg) { // C943
156158
context.Say(
157159
"ERRMSG may not be duplicated in a ALLOCATE statement"_err_en_US);
@@ -598,7 +600,7 @@ bool AllocationCheckerHelper::RunChecks(SemanticsContext &context) {
598600
std::optional<evaluate::ConstantSubscript> lbound;
599601
if (const auto &lb{std::get<0>(shapeSpec.t)}) {
600602
lbound.reset();
601-
const auto &lbExpr{lb->thing.thing.value()};
603+
const auto &lbExpr{parser::UnwrapRef<parser::Expr>(lb)};
602604
if (const auto *expr{GetExpr(context, lbExpr)}) {
603605
auto folded{
604606
evaluate::Fold(context.foldingContext(), SomeExpr(*expr))};
@@ -609,7 +611,8 @@ bool AllocationCheckerHelper::RunChecks(SemanticsContext &context) {
609611
lbound = 1;
610612
}
611613
if (lbound) {
612-
const auto &ubExpr{std::get<1>(shapeSpec.t).thing.thing.value()};
614+
const auto &ubExpr{
615+
parser::UnwrapRef<parser::Expr>(std::get<1>(shapeSpec.t))};
613616
if (const auto *expr{GetExpr(context, ubExpr)}) {
614617
auto folded{
615618
evaluate::Fold(context.foldingContext(), SomeExpr(*expr))};

flang/lib/Semantics/check-case.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ template <typename T> class CaseValues {
7272
}
7373

7474
std::optional<Value> GetValue(const parser::CaseValue &caseValue) {
75-
const parser::Expr &expr{caseValue.thing.thing.value()};
75+
const auto &expr{parser::UnwrapRef<parser::Expr>(caseValue)};
7676
auto *x{expr.typedExpr.get()};
7777
if (x && x->v) { // C1147
7878
auto type{x->v->GetType()};

flang/lib/Semantics/check-coarray.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ static void CheckTeamType(
112112

113113
static void CheckTeamStat(
114114
SemanticsContext &context, const parser::ImageSelectorSpec::Stat &stat) {
115-
const parser::Variable &var{stat.v.thing.thing.value()};
115+
const auto &var{parser::UnwrapRef<parser::Variable>(stat)};
116116
if (parser::GetCoindexedNamedObject(var)) {
117117
context.Say(parser::FindSourceLocation(var), // C931
118118
"Image selector STAT variable must not be a coindexed "
@@ -147,7 +147,8 @@ static void CheckSyncStat(SemanticsContext &context,
147147
},
148148
[&](const parser::MsgVariable &var) {
149149
WarnOnDeferredLengthCharacterScalar(context, GetExpr(context, var),
150-
var.v.thing.thing.GetSource(), "ERRMSG=");
150+
parser::UnwrapRef<parser::Variable>(var).GetSource(),
151+
"ERRMSG=");
151152
if (gotMsg) {
152153
context.Say( // C1172
153154
"The errmsg-variable in a sync-stat-list may not be repeated"_err_en_US);
@@ -260,7 +261,9 @@ static void CheckEventWaitSpecList(SemanticsContext &context,
260261
[&](const parser::MsgVariable &var) {
261262
WarnOnDeferredLengthCharacterScalar(context,
262263
GetExpr(context, var),
263-
var.v.thing.thing.GetSource(), "ERRMSG=");
264+
parser::UnwrapRef<parser::Variable>(var)
265+
.GetSource(),
266+
"ERRMSG=");
264267
if (gotMsg) {
265268
context.Say( // C1178
266269
"A errmsg-variable in a event-wait-spec-list may not be repeated"_err_en_US);

flang/lib/Semantics/check-data.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ namespace Fortran::semantics {
2525
// Ensures that references to an implied DO loop control variable are
2626
// represented as such in the "body" of the implied DO loop.
2727
void DataChecker::Enter(const parser::DataImpliedDo &x) {
28-
auto name{std::get<parser::DataImpliedDo::Bounds>(x.t).name.thing.thing};
28+
const auto &name{parser::UnwrapRef<parser::Name>(
29+
std::get<parser::DataImpliedDo::Bounds>(x.t).name)};
2930
int kind{evaluate::ResultType<evaluate::ImpliedDoIndex>::kind};
30-
if (const auto dynamicType{evaluate::DynamicType::From(*name.symbol)}) {
31+
if (const auto dynamicType{evaluate::DynamicType::From(DEREF(name.symbol))}) {
3132
if (dynamicType->category() == TypeCategory::Integer) {
3233
kind = dynamicType->kind();
3334
}
@@ -36,7 +37,8 @@ void DataChecker::Enter(const parser::DataImpliedDo &x) {
3637
}
3738

3839
void DataChecker::Leave(const parser::DataImpliedDo &x) {
39-
auto name{std::get<parser::DataImpliedDo::Bounds>(x.t).name.thing.thing};
40+
const auto &name{parser::UnwrapRef<parser::Name>(
41+
std::get<parser::DataImpliedDo::Bounds>(x.t).name)};
4042
exprAnalyzer_.RemoveImpliedDo(name.source);
4143
}
4244

@@ -211,7 +213,7 @@ void DataChecker::Leave(const parser::DataIDoObject &object) {
211213
std::get_if<parser::Scalar<common::Indirection<parser::Designator>>>(
212214
&object.u)}) {
213215
if (MaybeExpr expr{exprAnalyzer_.Analyze(*designator)}) {
214-
auto source{designator->thing.value().source};
216+
auto source{parser::UnwrapRef<parser::Designator>(*designator).source};
215217
DataVarChecker checker{exprAnalyzer_.context(), source};
216218
if (checker(*expr)) {
217219
if (checker.HasComponentWithoutSubscripts()) { // C880

flang/lib/Semantics/check-deallocate.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ void DeallocateChecker::Leave(const parser::DeallocateStmt &deallocateStmt) {
114114
},
115115
[&](const parser::MsgVariable &var) {
116116
WarnOnDeferredLengthCharacterScalar(context_,
117-
GetExpr(context_, var), var.v.thing.thing.GetSource(),
117+
GetExpr(context_, var),
118+
parser::UnwrapRef<parser::Variable>(var).GetSource(),
118119
"ERRMSG=");
119120
if (gotMsg) {
120121
context_.Say(

flang/lib/Semantics/check-do-forall.cpp

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,8 @@ class DoContext {
535535
if (const SomeExpr * expr{GetExpr(context_, scalarExpression)}) {
536536
if (!ExprHasTypeCategory(*expr, TypeCategory::Integer)) {
537537
// No warnings or errors for type INTEGER
538-
const parser::CharBlock &loc{scalarExpression.thing.value().source};
538+
parser::CharBlock loc{
539+
parser::UnwrapRef<parser::Expr>(scalarExpression).source};
539540
CheckDoControl(loc, ExprHasTypeCategory(*expr, TypeCategory::Real));
540541
}
541542
}
@@ -552,7 +553,7 @@ class DoContext {
552553
CheckDoExpression(*bounds.step);
553554
if (IsZero(*bounds.step)) {
554555
context_.Warn(common::UsageWarning::ZeroDoStep,
555-
bounds.step->thing.value().source,
556+
parser::UnwrapRef<parser::Expr>(bounds.step).source,
556557
"DO step expression should not be zero"_warn_en_US);
557558
}
558559
}
@@ -615,7 +616,7 @@ class DoContext {
615616
// C1121 - procedures in mask must be pure
616617
void CheckMaskIsPure(const parser::ScalarLogicalExpr &mask) const {
617618
UnorderedSymbolSet references{
618-
GatherSymbolsFromExpression(mask.thing.thing.value())};
619+
GatherSymbolsFromExpression(parser::UnwrapRef<parser::Expr>(mask))};
619620
for (const Symbol &ref : OrderBySourcePosition(references)) {
620621
if (IsProcedure(ref) && !IsPureProcedure(ref)) {
621622
context_.SayWithDecl(ref, parser::Unwrap<parser::Expr>(mask)->source,
@@ -639,32 +640,33 @@ class DoContext {
639640
}
640641

641642
void HasNoReferences(const UnorderedSymbolSet &indexNames,
642-
const parser::ScalarIntExpr &expr) const {
643-
CheckNoCollisions(GatherSymbolsFromExpression(expr.thing.thing.value()),
644-
indexNames,
643+
const parser::ScalarIntExpr &scalarIntExpr) const {
644+
const auto &expr{parser::UnwrapRef<parser::Expr>(scalarIntExpr)};
645+
CheckNoCollisions(GatherSymbolsFromExpression(expr), indexNames,
645646
"%s limit expression may not reference index variable '%s'"_err_en_US,
646-
expr.thing.thing.value().source);
647+
expr.source);
647648
}
648649

649650
// C1129, names in local locality-specs can't be in mask expressions
650651
void CheckMaskDoesNotReferenceLocal(const parser::ScalarLogicalExpr &mask,
651652
const UnorderedSymbolSet &localVars) const {
652-
CheckNoCollisions(GatherSymbolsFromExpression(mask.thing.thing.value()),
653-
localVars,
653+
const auto &expr{parser::UnwrapRef<parser::Expr>(mask)};
654+
CheckNoCollisions(GatherSymbolsFromExpression(expr), localVars,
654655
"%s mask expression references variable '%s'"
655656
" in LOCAL locality-spec"_err_en_US,
656-
mask.thing.thing.value().source);
657+
expr.source);
657658
}
658659

659660
// C1129, names in local locality-specs can't be in limit or step
660661
// expressions
661-
void CheckExprDoesNotReferenceLocal(const parser::ScalarIntExpr &expr,
662+
void CheckExprDoesNotReferenceLocal(
663+
const parser::ScalarIntExpr &scalarIntExpr,
662664
const UnorderedSymbolSet &localVars) const {
663-
CheckNoCollisions(GatherSymbolsFromExpression(expr.thing.thing.value()),
664-
localVars,
665+
const auto &expr{parser::UnwrapRef<parser::Expr>(scalarIntExpr)};
666+
CheckNoCollisions(GatherSymbolsFromExpression(expr), localVars,
665667
"%s expression references variable '%s'"
666668
" in LOCAL locality-spec"_err_en_US,
667-
expr.thing.thing.value().source);
669+
expr.source);
668670
}
669671

670672
// C1130, DEFAULT(NONE) locality requires names to be in locality-specs to
@@ -772,7 +774,7 @@ class DoContext {
772774
HasNoReferences(indexNames, std::get<2>(control.t));
773775
if (const auto &intExpr{
774776
std::get<std::optional<parser::ScalarIntExpr>>(control.t)}) {
775-
const parser::Expr &expr{intExpr->thing.thing.value()};
777+
const auto &expr{parser::UnwrapRef<parser::Expr>(intExpr)};
776778
CheckNoCollisions(GatherSymbolsFromExpression(expr), indexNames,
777779
"%s step expression may not reference index variable '%s'"_err_en_US,
778780
expr.source);
@@ -840,7 +842,7 @@ class DoContext {
840842
}
841843
void CheckForImpureCall(const parser::ScalarIntExpr &x,
842844
std::optional<IndexVarKind> nesting) const {
843-
const auto &parsedExpr{x.thing.thing.value()};
845+
const auto &parsedExpr{parser::UnwrapRef<parser::Expr>(x)};
844846
auto oldLocation{context_.location()};
845847
context_.set_location(parsedExpr.source);
846848
if (const auto &typedExpr{parsedExpr.typedExpr}) {
@@ -1124,7 +1126,8 @@ void DoForallChecker::Leave(const parser::ConnectSpec &connectSpec) {
11241126
const auto *newunit{
11251127
std::get_if<parser::ConnectSpec::Newunit>(&connectSpec.u)};
11261128
if (newunit) {
1127-
context_.CheckIndexVarRedefine(newunit->v.thing.thing);
1129+
context_.CheckIndexVarRedefine(
1130+
parser::UnwrapRef<parser::Variable>(newunit));
11281131
}
11291132
}
11301133

@@ -1166,14 +1169,14 @@ void DoForallChecker::Leave(const parser::InquireSpec &inquireSpec) {
11661169
const auto *intVar{std::get_if<parser::InquireSpec::IntVar>(&inquireSpec.u)};
11671170
if (intVar) {
11681171
const auto &scalar{std::get<parser::ScalarIntVariable>(intVar->t)};
1169-
context_.CheckIndexVarRedefine(scalar.thing.thing);
1172+
context_.CheckIndexVarRedefine(parser::UnwrapRef<parser::Variable>(scalar));
11701173
}
11711174
}
11721175

11731176
void DoForallChecker::Leave(const parser::IoControlSpec &ioControlSpec) {
11741177
const auto *size{std::get_if<parser::IoControlSpec::Size>(&ioControlSpec.u)};
11751178
if (size) {
1176-
context_.CheckIndexVarRedefine(size->v.thing.thing);
1179+
context_.CheckIndexVarRedefine(parser::UnwrapRef<parser::Variable>(size));
11771180
}
11781181
}
11791182

@@ -1190,16 +1193,19 @@ static void CheckIoImpliedDoIndex(
11901193

11911194
void DoForallChecker::Leave(const parser::OutputImpliedDo &outputImpliedDo) {
11921195
CheckIoImpliedDoIndex(context_,
1193-
std::get<parser::IoImpliedDoControl>(outputImpliedDo.t).name.thing.thing);
1196+
parser::UnwrapRef<parser::Name>(
1197+
std::get<parser::IoImpliedDoControl>(outputImpliedDo.t).name));
11941198
}
11951199

11961200
void DoForallChecker::Leave(const parser::InputImpliedDo &inputImpliedDo) {
11971201
CheckIoImpliedDoIndex(context_,
1198-
std::get<parser::IoImpliedDoControl>(inputImpliedDo.t).name.thing.thing);
1202+
parser::UnwrapRef<parser::Name>(
1203+
std::get<parser::IoImpliedDoControl>(inputImpliedDo.t).name));
11991204
}
12001205

12011206
void DoForallChecker::Leave(const parser::StatVariable &statVariable) {
1202-
context_.CheckIndexVarRedefine(statVariable.v.thing.thing);
1207+
context_.CheckIndexVarRedefine(
1208+
parser::UnwrapRef<parser::Variable>(statVariable));
12031209
}
12041210

12051211
} // namespace Fortran::semantics

0 commit comments

Comments
 (0)