From 259c540191b496f03bb59d583189e0a20e2bb66b Mon Sep 17 00:00:00 2001 From: Peter Steinfeld Date: Wed, 10 Apr 2019 09:45:41 -0700 Subject: [PATCH] [flang] Fix issue 392, improve the error message when a DO loop is terminated by a statement other than END DO or CONTINUE. Original-commit: flang-compiler/f18@0a9280eab16394b578d8b1eae76e3a679b697770 Reviewed-on: https://github.com/flang-compiler/f18/pull/398 Tree-same-pre-rewrite: false --- flang/lib/semantics/resolve-labels.cc | 22 ++++++++++++---------- flang/test/semantics/canondo07.f90 | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 flang/test/semantics/canondo07.f90 diff --git a/flang/lib/semantics/resolve-labels.cc b/flang/lib/semantics/resolve-labels.cc index b56bb51..466f271 100644 --- a/flang/lib/semantics/resolve-labels.cc +++ b/flang/lib/semantics/resolve-labels.cc @@ -893,17 +893,19 @@ void CheckLabelDoConstraints(const SourceStmtList &dos, parser::MessageFormattedText{ "label '%u' is not in scope"_en_US, SayLabel(label)}); } else if (!doTarget.labeledStmtClassificationSet.test( - TargetStatementEnum::Do) && - !doTarget.labeledStmtClassificationSet.test( - TargetStatementEnum::CompatibleDo)) { - errorHandler.Say(doTarget.parserCharBlock, - parser::MessageFormattedText{ - "'%u' invalid DO terminal statement"_err_en_US, SayLabel(label)}); - } else if (!doTarget.labeledStmtClassificationSet.test( TargetStatementEnum::Do)) { - errorHandler.Say(doTarget.parserCharBlock, - parser::MessageFormattedText{ - "'%u' invalid DO terminal statement"_en_US, SayLabel(label)}); + if (!doTarget.labeledStmtClassificationSet.test( + TargetStatementEnum::CompatibleDo)) { + errorHandler.Say(doTarget.parserCharBlock, + parser::MessageFormattedText{ + "'%u' DO statements must terminate with END DO or CONTINUE"_err_en_US, + SayLabel(label)}); + } else { + errorHandler.Say(doTarget.parserCharBlock, + parser::MessageFormattedText{ + "'%u' Obsolete construct not allowed. DO statements must terminate with END DO or CONTINUE"_en_US, + SayLabel(label)}); + } } else { loopBodies.emplace_back(SkipLabel(position), doTarget.parserCharBlock); } diff --git a/flang/test/semantics/canondo07.f90 b/flang/test/semantics/canondo07.f90 new file mode 100644 index 0000000..5fb8fc6 --- /dev/null +++ b/flang/test/semantics/canondo07.f90 @@ -0,0 +1,24 @@ +! Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. + +! Error test -- DO loop uses obsolete loop termination statement +! See R1131 and C1131 + +! RUN: ${F18} -funparse-with-symbols %s 2>&1 | ${FileCheck} %s +! CHECK: Obsolete construct not allowed. DO statements must terminate with END DO or CONTINUE + +program endDo + do 10 i = 1, 5 +10 print *, "in loop" +end program endDo -- 2.7.4