[flang] Process names in ASSIGN and assigned GOTO

Allow ASSIGNed integer variables as formats

Address review comment

Original-commit: flang-compiler/f18@361a151508b4a1940fc0669dead180be67964d8d
Reviewed-on: https://github.com/flang-compiler/f18/pull/1099
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index f5f7a18..2e5227c 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -2573,9 +2573,10 @@
 };
 
 // R1215 format -> default-char-expr | label | *
+// deprecated(ASSIGN): | scalar-int-name
 struct Format {
   UNION_CLASS_BOILERPLATE(Format);
-  std::variant<DefaultCharExpr, Label, Star> u;
+  std::variant<Expr, Label, Star> u;
 };
 
 // R1214 id-variable -> scalar-int-variable
diff --git a/flang/lib/Parser/io-parsers.cpp b/flang/lib/Parser/io-parsers.cpp
index 9eab721..30f6db1 100644
--- a/flang/lib/Parser/io-parsers.cpp
+++ b/flang/lib/Parser/io-parsers.cpp
@@ -240,8 +240,9 @@
         "PRINT" >> format, defaulted("," >> nonemptyList(outputItem))))
 
 // R1215 format -> default-char-expr | label | *
+// deprecated(ASSIGN): | scalar-int-name
 TYPE_PARSER(construct<Format>(label / !"_."_ch) ||
-    construct<Format>(defaultCharExpr / !"="_tok) || construct<Format>(star))
+    construct<Format>(expr / !"="_tok) || construct<Format>(star))
 
 // R1216 input-item -> variable | io-implied-do
 TYPE_PARSER(construct<InputItem>(variable) ||
diff --git a/flang/lib/Semantics/check-io.cpp b/flang/lib/Semantics/check-io.cpp
index d670c79..0e447bc 100644
--- a/flang/lib/Semantics/check-io.cpp
+++ b/flang/lib/Semantics/check-io.cpp
@@ -195,7 +195,29 @@
       common::visitors{
           [&](const parser::Label &) { flags_.set(Flag::LabelFmt); },
           [&](const parser::Star &) { flags_.set(Flag::StarFmt); },
-          [&](const parser::DefaultCharExpr &format) {
+          [&](const parser::Expr &format) {
+            const SomeExpr *expr{GetExpr(format)};
+            if (!expr) {
+              return;
+            }
+            auto type{expr->GetType()};
+            if (!type ||
+                (type->category() != TypeCategory::Integer &&
+                    type->category() != TypeCategory::Character) ||
+                type->kind() !=
+                    context_.defaultKinds().GetDefaultKind(type->category())) {
+              context_.Say(format.source,
+                  "Format expression must be default character or integer"_err_en_US);
+              return;
+            }
+            if (type->category() == TypeCategory::Integer) {
+              flags_.set(Flag::AssignFmt);
+              if (expr->Rank() != 0 || !IsVariable(*expr)) {
+                context_.Say(format.source,
+                    "Assigned format label must be a scalar variable"_err_en_US);
+              }
+              return;
+            }
             flags_.set(Flag::CharFmt);
             const std::optional<std::string> constantFormat{
                 GetConstExpr<std::string>(format)};
@@ -203,11 +225,10 @@
               return;
             }
             // validate constant format -- 12.6.2.2
-            bool isFolded{constantFormat->size() !=
-                format.thing.value().source.size() - 2};
+            bool isFolded{constantFormat->size() != format.source.size() - 2};
             parser::CharBlock reporterCharBlock{isFolded
-                    ? parser::CharBlock{format.thing.value().source}
-                    : parser::CharBlock{format.thing.value().source.begin() + 1,
+                    ? parser::CharBlock{format.source}
+                    : parser::CharBlock{format.source.begin() + 1,
                           static_cast<std::size_t>(0)}};
             FormatErrorReporter reporter{context_, reporterCharBlock};
             auto reporterWrapper{
@@ -723,7 +744,8 @@
   CheckForProhibitedSpecifier(
       IoSpecKind::Rec, flags_.test(Flag::StarFmt), "FMT=*"); // C1220
   CheckForRequiredSpecifier(IoSpecKind::Advance,
-      flags_.test(Flag::CharFmt) || flags_.test(Flag::LabelFmt),
+      flags_.test(Flag::CharFmt) || flags_.test(Flag::LabelFmt) ||
+          flags_.test(Flag::AssignFmt),
       "an explicit format"); // C1221
   CheckForProhibitedSpecifier(IoSpecKind::Advance,
       flags_.test(Flag::InternalUnit), "UNIT=internal-file"); // C1221
diff --git a/flang/lib/Semantics/check-io.h b/flang/lib/Semantics/check-io.h
index 6763657..b5e8f12 100644
--- a/flang/lib/Semantics/check-io.h
+++ b/flang/lib/Semantics/check-io.h
@@ -81,9 +81,9 @@
 private:
   // Presence flag values.
   ENUM_CLASS(Flag, IoControlList, InternalUnit, NumberUnit, StarUnit, CharFmt,
-      LabelFmt, StarFmt, FmtOrNml, KnownAccess, AccessDirect, AccessStream,
-      AdvanceYes, AsynchronousYes, KnownStatus, StatusNew, StatusReplace,
-      StatusScratch, DataList)
+      LabelFmt, StarFmt, AssignFmt, FmtOrNml, KnownAccess, AccessDirect,
+      AccessStream, AdvanceYes, AsynchronousYes, KnownStatus, StatusNew,
+      StatusReplace, StatusScratch, DataList)
 
   template <typename R, typename T> std::optional<R> GetConstExpr(const T &x) {
     using DefaultCharConstantType =
diff --git a/flang/lib/Semantics/resolve-labels.cpp b/flang/lib/Semantics/resolve-labels.cpp
index 66f86c6..0c67a07 100644
--- a/flang/lib/Semantics/resolve-labels.cpp
+++ b/flang/lib/Semantics/resolve-labels.cpp
@@ -154,16 +154,11 @@
 
 struct UnitAnalysis {
   UnitAnalysis() { scopeModel.push_back(0); }
-  UnitAnalysis(UnitAnalysis &&that)
-      : doStmtSources{std::move(that.doStmtSources)},
-        formatStmtSources{std::move(that.formatStmtSources)},
-        otherStmtSources{std::move(that.otherStmtSources)},
-        targetStmts{std::move(that.targetStmts)}, scopeModel{std::move(
-                                                      that.scopeModel)} {}
 
   SourceStmtList doStmtSources;
   SourceStmtList formatStmtSources;
   SourceStmtList otherStmtSources;
+  SourceStmtList assignStmtSources;
   TargetStmtMap targetStmts;
   std::vector<ProxyForScope> scopeModel;
 };
@@ -465,7 +460,7 @@
     AddLabelReference(std::get<3>(arithmeticIfStmt.t));
   }
   void Post(const parser::AssignStmt &assignStmt) {
-    AddLabelReference(std::get<parser::Label>(assignStmt.t));
+    AddLabelReferenceFromAssignStmt(std::get<parser::Label>(assignStmt.t));
   }
   void Post(const parser::AssignedGotoStmt &assignedGotoStmt) {
     AddLabelReference(std::get<std::list<parser::Label>>(assignedGotoStmt.t));
@@ -726,7 +721,7 @@
     if (label < 1 || label > 99999) {
       context_.Say(currentPosition_,
           parser::MessageFormattedText{
-              "label '%u' is out of range"_err_en_US, SayLabel(label)});
+              "Label '%u' is out of range"_err_en_US, SayLabel(label)});
     }
   }
 
@@ -742,7 +737,7 @@
     if (!pair.second) {
       context_.Say(currentPosition_,
           parser::MessageFormattedText{
-              "label '%u' is not distinct"_err_en_US, SayLabel(label)});
+              "Label '%u' is not distinct"_err_en_US, SayLabel(label)});
     }
   }
 
@@ -758,6 +753,12 @@
         label, currentScope_, currentPosition_);
   }
 
+  void AddLabelReferenceFromAssignStmt(parser::Label label) {
+    CheckLabelInRange(label);
+    programUnits_.back().assignStmtSources.emplace_back(
+        label, currentScope_, currentPosition_);
+  }
+
   void AddLabelReference(parser::Label label) {
     CheckLabelInRange(label);
     programUnits_.back().otherStmtSources.emplace_back(
@@ -879,12 +880,12 @@
       // C1133
       context.Say(position,
           parser::MessageFormattedText{
-              "label '%u' cannot be found"_err_en_US, SayLabel(label)});
+              "Label '%u' cannot be found"_err_en_US, SayLabel(label)});
     } else if (doTarget.parserCharBlock.begin() < position.begin()) {
       // R1119
       context.Say(position,
           parser::MessageFormattedText{
-              "label '%u' doesn't lexically follow DO stmt"_err_en_US,
+              "Label '%u' doesn't lexically follow DO stmt"_err_en_US,
               SayLabel(label)});
 
     } else if ((InInclusiveScope(scopes, scope, doTarget.proxyForScope) &&
@@ -905,7 +906,7 @@
     } else if (!InInclusiveScope(scopes, scope, doTarget.proxyForScope)) {
       context.Say(position,
           parser::MessageFormattedText{
-              "label '%u' is not in DO loop scope"_err_en_US, SayLabel(label)});
+              "Label '%u' is not in DO loop scope"_err_en_US, SayLabel(label)});
     } else if (!doTarget.labeledStmtClassificationSet.test(
                    TargetStatementEnum::Do)) {
       context.Say(doTarget.parserCharBlock,
@@ -932,11 +933,11 @@
     if (!HasScope(target.proxyForScope)) {
       context.Say(position,
           parser::MessageFormattedText{
-              "label '%u' was not found"_err_en_US, SayLabel(label)});
+              "Label '%u' was not found"_err_en_US, SayLabel(label)});
     } else if (!InInclusiveScope(scopes, scope, target.proxyForScope)) {
       context.Say(position,
           parser::MessageFormattedText{
-              "label '%u' is not in scope"_en_US, SayLabel(label)});
+              "Label '%u' is not in scope"_en_US, SayLabel(label)});
     }
   }
 }
@@ -950,23 +951,24 @@
       if (!branchTarget.labeledStmtClassificationSet.test(
               TargetStatementEnum::Branch) &&
           !branchTarget.labeledStmtClassificationSet.test(
-              TargetStatementEnum::CompatibleBranch)) {
+              TargetStatementEnum::CompatibleBranch)) { // error
         context
             .Say(branchTarget.parserCharBlock,
                 parser::MessageFormattedText{
-                    "'%u' not a branch target"_err_en_US, SayLabel(label)})
+                    "Label '%u' is not a branch target"_err_en_US,
+                    SayLabel(label)})
             .Attach(stmt.parserCharBlock,
                 parser::MessageFormattedText{
-                    "control flow use of '%u'"_en_US, SayLabel(label)});
+                    "Control flow use of '%u'"_en_US, SayLabel(label)});
       } else if (!branchTarget.labeledStmtClassificationSet.test(
-                     TargetStatementEnum::Branch)) {
+                     TargetStatementEnum::Branch)) { // warning
         context
             .Say(branchTarget.parserCharBlock,
                 parser::MessageFormattedText{
-                    "'%u' not a branch target"_en_US, SayLabel(label)})
+                    "Label '%u' is not a branch target"_en_US, SayLabel(label)})
             .Attach(stmt.parserCharBlock,
                 parser::MessageFormattedText{
-                    "control flow use of '%u'"_en_US, SayLabel(label)});
+                    "Control flow use of '%u'"_en_US, SayLabel(label)});
       }
     }
   }
@@ -1006,6 +1008,36 @@
   CheckDataXferTargetConstraints(dataTransfers, labels, context);
 }
 
+void CheckAssignTargetConstraints(const SourceStmtList &stmts,
+    const TargetStmtMap &labels, SemanticsContext &context) {
+  for (const auto &stmt : stmts) {
+    const auto &label{stmt.parserLabel};
+    auto target{GetLabel(labels, label)};
+    if (HasScope(target.proxyForScope) &&
+        !target.labeledStmtClassificationSet.test(
+            TargetStatementEnum::Branch) &&
+        !target.labeledStmtClassificationSet.test(
+            TargetStatementEnum::Format)) {
+      context
+          .Say(target.parserCharBlock,
+              target.labeledStmtClassificationSet.test(
+                  TargetStatementEnum::CompatibleBranch)
+                  ? "Label '%u' is not a branch target or FORMAT"_en_US
+                  : "Label '%u' is not a branch target or FORMAT"_err_en_US,
+              SayLabel(label))
+          .Attach(stmt.parserCharBlock, "ASSIGN statement use of '%u'"_en_US,
+              SayLabel(label));
+    }
+  }
+}
+
+void CheckAssignConstraints(const SourceStmtList &assigns,
+    const TargetStmtMap &labels, const std::vector<ProxyForScope> &scopes,
+    SemanticsContext &context) {
+  CheckScopeConstraints(assigns, labels, scopes, context);
+  CheckAssignTargetConstraints(assigns, labels, context);
+}
+
 bool CheckConstraints(ParseTreeAnalyzer &&parseTreeAnalysis) {
   auto &context{parseTreeAnalysis.ErrorHandler()};
   for (const auto &programUnit : parseTreeAnalysis.ProgramUnits()) {
@@ -1017,6 +1049,8 @@
     CheckBranchConstraints(branches, labels, scopes, context);
     const auto &dataTransfers{programUnit.formatStmtSources};
     CheckDataTransferConstraints(dataTransfers, labels, scopes, context);
+    const auto &assigns{programUnit.assignStmtSources};
+    CheckAssignConstraints(assigns, labels, scopes, context);
   }
   return !context.AnyFatalError();
 }
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index ee2db03..7828d69 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1387,6 +1387,8 @@
   bool Pre(const parser::StmtFunctionStmt &);
   bool Pre(const parser::DefinedOpName &);
   bool Pre(const parser::ProgramUnit &);
+  void Post(const parser::AssignStmt &);
+  void Post(const parser::AssignedGotoStmt &);
 
   // These nodes should never be reached: they are handled in ProgramUnit
   bool Pre(const parser::MainProgram &) { DIE("unreachable"); }
@@ -6056,6 +6058,17 @@
   return false;
 }
 
+void ResolveNamesVisitor::Post(const parser::AssignStmt &x) {
+  if (auto *name{ResolveName(std::get<parser::Name>(x.t))}) {
+    ConvertToObjectEntity(DEREF(name->symbol));
+  }
+}
+void ResolveNamesVisitor::Post(const parser::AssignedGotoStmt &x) {
+  if (auto *name{ResolveName(std::get<parser::Name>(x.t))}) {
+    ConvertToObjectEntity(DEREF(name->symbol));
+  }
+}
+
 bool ResolveNamesVisitor::Pre(const parser::ProgramUnit &x) {
   auto root{ProgramTree::Build(x)};
   SetScope(context().globalScope());
diff --git a/flang/lib/Semantics/rewrite-parse-tree.cpp b/flang/lib/Semantics/rewrite-parse-tree.cpp
index 046c61e..435bafc 100644
--- a/flang/lib/Semantics/rewrite-parse-tree.cpp
+++ b/flang/lib/Semantics/rewrite-parse-tree.cpp
@@ -132,7 +132,7 @@
 template <typename READ_OR_WRITE>
 void FixMisparsedUntaggedNamelistName(READ_OR_WRITE &x) {
   if (x.iounit && x.format &&
-      std::holds_alternative<parser::DefaultCharExpr>(x.format->u)) {
+      std::holds_alternative<parser::Expr>(x.format->u)) {
     if (const parser::Name * name{parser::Unwrap<parser::Name>(x.format)}) {
       if (name->symbol && name->symbol->GetUltimate().has<NamelistDetails>()) {
         x.controls.emplace_front(parser::IoControlSpec{std::move(*name)});
diff --git a/flang/lib/Semantics/semantics.cpp b/flang/lib/Semantics/semantics.cpp
index 406396b..cfc1614 100644
--- a/flang/lib/Semantics/semantics.cpp
+++ b/flang/lib/Semantics/semantics.cpp
@@ -113,25 +113,49 @@
   SemanticsContext &context_;
 };
 
-class EntryChecker : public virtual BaseChecker {
+class MiscChecker : public virtual BaseChecker {
 public:
-  explicit EntryChecker(SemanticsContext &context) : context_{context} {}
+  explicit MiscChecker(SemanticsContext &context) : context_{context} {}
   void Leave(const parser::EntryStmt &) {
     if (!context_.constructStack().empty()) { // C1571
       context_.Say("ENTRY may not appear in an executable construct"_err_en_US);
     }
   }
+  void Leave(const parser::AssignStmt &stmt) {
+    CheckAssignGotoName(std::get<parser::Name>(stmt.t));
+  }
+  void Leave(const parser::AssignedGotoStmt &stmt) {
+    CheckAssignGotoName(std::get<parser::Name>(stmt.t));
+  }
 
 private:
+  void CheckAssignGotoName(const parser::Name &name) {
+    if (context_.HasError(name.symbol)) {
+      return;
+    }
+    const Symbol &symbol{DEREF(name.symbol)};
+    auto type{evaluate::DynamicType::From(symbol)};
+    if (!IsVariableName(symbol) || symbol.Rank() != 0 || !type ||
+        type->category() != TypeCategory::Integer ||
+        type->kind() !=
+            context_.defaultKinds().GetDefaultKind(TypeCategory::Integer)) {
+      context_
+          .Say(name.source,
+              "'%s' must be a default integer scalar variable"_err_en_US,
+              name.source)
+          .Attach(symbol.name(), "Declaration of '%s'"_en_US, symbol.name());
+    }
+  }
+
   SemanticsContext &context_;
 };
 
 using StatementSemanticsPass1 = ExprChecker;
 using StatementSemanticsPass2 = SemanticsVisitor<AllocateChecker,
     ArithmeticIfStmtChecker, AssignmentChecker, CaseChecker, CoarrayChecker,
-    DataChecker, DeallocateChecker, DoForallChecker, EntryChecker,
-    IfStmtChecker, IoChecker, NamelistChecker, NullifyChecker,
-    OmpStructureChecker, PurityChecker, ReturnStmtChecker, StopChecker>;
+    DataChecker, DeallocateChecker, DoForallChecker, IfStmtChecker, IoChecker,
+    MiscChecker, NamelistChecker, NullifyChecker, OmpStructureChecker,
+    PurityChecker, ReturnStmtChecker, StopChecker>;
 
 static bool PerformStatementSemantics(
     SemanticsContext &context, parser::Program &program) {
diff --git a/flang/test/Semantics/assign06.f90 b/flang/test/Semantics/assign06.f90
new file mode 100644
index 0000000..33b7f70
--- /dev/null
+++ b/flang/test/Semantics/assign06.f90
@@ -0,0 +1,47 @@
+! RUN: %B/test/Semantics/test_errors.sh %s %flang %t
+! Test ASSIGN statement, assigned GOTO, and assigned format labels
+! (see subclause 8.2.4 in Fortran 90 (*not* 2018!)
+
+program main
+  call test(0)
+ contains
+  subroutine test(n)
+    integer, intent(in) :: n
+    integer :: lab
+    integer(kind=1) :: badlab1
+    real :: badlab2
+    integer :: badlab3(1)
+    assign 1 to lab ! ok
+    assign 1 to implicitlab1 ! ok
+    !ERROR: 'badlab1' must be a default integer scalar variable
+    assign 1 to badlab1
+    !ERROR: 'badlab2' must be a default integer scalar variable
+    assign 1 to badlab2
+    !ERROR: 'badlab3' must be a default integer scalar variable
+    assign 1 to badlab3
+    !ERROR: 'test' must be a default integer scalar variable
+    assign 1 to test
+    if (n==1) goto lab ! ok
+    if (n==1) goto implicitlab2 ! ok
+    !ERROR: 'badlab1' must be a default integer scalar variable
+    if (n==1) goto badlab1
+    !ERROR: 'badlab2' must be a default integer scalar variable
+    if (n==1) goto badlab2
+    !ERROR: 'badlab3' must be a default integer scalar variable
+    if (n==1) goto badlab3
+    if (n==1) goto lab(1) ! ok
+    if (n==1) goto lab,(1) ! ok
+    if (n==1) goto lab(1,1) ! ok
+    assign 3 to lab ! ok
+    write(*,fmt=lab) ! ok
+    write(*,fmt=implicitlab3) ! ok
+    !ERROR: Format expression must be default character or integer
+    write(*,fmt=badlab1)
+    !ERROR: Format expression must be default character or integer
+    write(*,fmt=badlab2)
+    !ERROR: Format expression must be default character or integer
+    write(*,fmt=badlab2)
+1   continue
+3   format('yes')
+  end subroutine test
+end program
diff --git a/flang/test/Semantics/assign07.f90 b/flang/test/Semantics/assign07.f90
new file mode 100644
index 0000000..9d62da5
--- /dev/null
+++ b/flang/test/Semantics/assign07.f90
@@ -0,0 +1,35 @@
+! RUN: %B/test/Semantics/test_errors.sh %s %flang %t
+! Test ASSIGN statement, assigned GOTO, and assigned format labels
+! (see subclause 8.2.4 in Fortran 90 (*not* 2018!)
+
+program main
+  call test(0)
+2 format('no')
+ contains
+  subroutine test(n)
+    !ERROR: Label '4' is not a branch target or FORMAT
+4   integer, intent(in) :: n
+    integer :: lab
+    assign 1 to lab ! ok
+    assign 1 to implicitlab1 ! ok
+    !ERROR: Label '666' was not found
+    assign 666 to lab
+    !ERROR: Label '2' was not found
+    assign 2 to lab
+    assign 4 to lab
+    if (n==1) goto lab ! ok
+    if (n==1) goto implicitlab2 ! ok
+    if (n==1) goto lab(1) ! ok
+    if (n==1) goto lab,(1) ! ok
+    if (n==1) goto lab(1,1) ! ok
+    !ERROR: Label '666' was not found
+    if (n==1) goto lab(1,666)
+    !ERROR: Label '2' was not found
+    if (n==1) goto lab(1,2)
+    assign 3 to lab
+    write(*,fmt=lab) ! ok
+    write(*,fmt=implicitlab3) ! ok
+1   continue
+3   format('yes')
+  end subroutine test
+end program
diff --git a/flang/test/Semantics/if_arith03.f90 b/flang/test/Semantics/if_arith03.f90
index 45ceec4..a9a3e50 100644
--- a/flang/test/Semantics/if_arith03.f90
+++ b/flang/test/Semantics/if_arith03.f90
@@ -1,19 +1,19 @@
 ! RUN: %B/test/Semantics/test_errors.sh %s %flang %t
 
 
-!ERROR: label '600' was not found
+!ERROR: Label '600' was not found
 if ( A ) 100, 200, 600
 100 CONTINUE
 200 CONTINUE
 300 CONTINUE
 
-!ERROR: label '601' was not found
+!ERROR: Label '601' was not found
 if ( A ) 101, 601, 301
 101 CONTINUE
 201 CONTINUE
 301 CONTINUE
 
-!ERROR: label '602' was not found
+!ERROR: Label '602' was not found
 if ( A ) 602, 202, 302
 102 CONTINUE
 202 CONTINUE
diff --git a/flang/test/Semantics/label02.f90 b/flang/test/Semantics/label02.f90
index 6aa052d..e988681 100644
--- a/flang/test/Semantics/label02.f90
+++ b/flang/test/Semantics/label02.f90
@@ -2,11 +2,11 @@
 ! negative test -- invalid labels, out of range
 
 ! EXEC: ${F18} -funparse-with-symbols %s 2>&1 | ${FileCheck} %s
-! CHECK: label '0' is out of range
-! CHECK: label '100000' is out of range
-! CHECK: label '123456' is out of range
-! CHECK: label '123456' was not found
-! CHECK: label '1000' is not distinct
+! CHECK: Label '0' is out of range
+! CHECK: Label '100000' is out of range
+! CHECK: Label '123456' is out of range
+! CHECK: Label '123456' was not found
+! CHECK: Label '1000' is not distinct
 
 subroutine sub00(a,b,n,m)
   real a(n)
diff --git a/flang/test/Semantics/label03.f90 b/flang/test/Semantics/label03.f90
index a33b2f3..557bb00 100644
--- a/flang/test/Semantics/label03.f90
+++ b/flang/test/Semantics/label03.f90
@@ -4,9 +4,9 @@
 ! EXEC: ${F18} -funparse-with-symbols %s 2>&1 | ${FileCheck} %s
 ! CHECK: DO loop doesn't properly nest
 ! CHECK: DO loop conflicts
-! CHECK: label '30' cannot be found
-! CHECK: label '40' cannot be found
-! CHECK: label '50' doesn't lexically follow DO stmt
+! CHECK: Label '30' cannot be found
+! CHECK: Label '40' cannot be found
+! CHECK: Label '50' doesn't lexically follow DO stmt
 
 subroutine sub00(a,b,n,m)
   real a(n,m)
diff --git a/flang/test/Semantics/label05.f90 b/flang/test/Semantics/label05.f90
index 09bd9fa..94765fb 100644
--- a/flang/test/Semantics/label05.f90
+++ b/flang/test/Semantics/label05.f90
@@ -2,10 +2,10 @@
 ! negative test -- invalid labels, out of range
 
 ! EXEC: ${F18} -funparse-with-symbols %s 2>&1 | ${FileCheck} %s
-! CHECK: label '50' was not found
-! CHECK: label '55' is not in scope
-! CHECK: '70' not a branch target
-! CHECK: control flow use of '70'
+! CHECK: Label '50' was not found
+! CHECK: Label '55' is not in scope
+! CHECK: Label '70' is not a branch target
+! CHECK: Control flow use of '70'
 
 subroutine sub00(a,b,n,m)
   real a(n,m)
diff --git a/flang/test/Semantics/label06.f90 b/flang/test/Semantics/label06.f90
index 4e633d3..34dc436 100644
--- a/flang/test/Semantics/label06.f90
+++ b/flang/test/Semantics/label06.f90
@@ -2,12 +2,12 @@
 ! negative test -- invalid labels, out of range
 
 ! EXEC: ${F18} -funparse-with-symbols %s 2>&1 | ${FileCheck} %s
-! CHECK: label '10' is not in scope
-! CHECK: label '20' was not found
-! CHECK: '30' not a branch target
-! CHECK: control flow use of '30'
-! CHECK: label '40' is not in scope
-! CHECK: label '50' is not in scope
+! CHECK: Label '10' is not in scope
+! CHECK: Label '20' was not found
+! CHECK: Label '30' is not a branch target
+! CHECK: Control flow use of '30'
+! CHECK: Label '40' is not in scope
+! CHECK: Label '50' is not in scope
 
 subroutine sub00(n)
   GOTO (10,20,30) n
diff --git a/flang/test/Semantics/label07.f90 b/flang/test/Semantics/label07.f90
index 6275508..f1d440a 100644
--- a/flang/test/Semantics/label07.f90
+++ b/flang/test/Semantics/label07.f90
@@ -2,11 +2,11 @@
 ! negative test -- invalid labels, out of range
 
 ! EXEC: ${F18} -funparse-with-symbols %s 2>&1 | ${FileCheck} %s
-! CHECK: '30' not a branch target
-! CHECK: control flow use of '30'
-! CHECK: label '10' is not in scope
-! CHECK: label '20' was not found
-! CHECK: label '60' was not found
+! CHECK: Label '30' is not a branch target
+! CHECK: Control flow use of '30'
+! CHECK: Label '10' is not in scope
+! CHECK: Label '20' was not found
+! CHECK: Label '60' was not found
 
 subroutine sub00(n,m)
 30 format (i6,f6.2)
diff --git a/flang/test/Semantics/label09.f90 b/flang/test/Semantics/label09.f90
index a74263d..d7e5ae3 100644
--- a/flang/test/Semantics/label09.f90
+++ b/flang/test/Semantics/label09.f90
@@ -1,6 +1,6 @@
 ! RUN: %S/test_any.sh %s %flang %t
 ! EXEC: ${F18} -funparse-with-symbols %s 2>&1 | ${FileCheck} %s
-! CHECK: label '60' was not found
+! CHECK: Label '60' was not found
 
 subroutine s(a)
   real a(10)
diff --git a/flang/test/Semantics/label14.f90 b/flang/test/Semantics/label14.f90
index e6eb744..b163668 100644
--- a/flang/test/Semantics/label14.f90
+++ b/flang/test/Semantics/label14.f90
@@ -4,7 +4,7 @@
 !            Block Construct
 
 ! EXEC: ${F18} %s 2>&1 | ${FileCheck} %s
-! CHECK: label '20' is not in scope
+! CHECK: Label '20' is not in scope
 
 subroutine s1
   block