From cb37c3625a87da330d6df9d401e7ebd12b540b5f Mon Sep 17 00:00:00 2001 From: Tim Keith Date: Wed, 25 Apr 2018 10:46:39 -0700 Subject: [PATCH] [flang] Non-fatal error for repeated access spec When an access statement repeats the same attribute, make it a non-fatal diagnostic. Also, include the previous specification in the message. resolve11.f90 now illustrates both cases, fatal and non-fatal. Original-commit: flang-compiler/f18@1f567c740a8ec300d247f63a69b15ca820e757a3 Reviewed-on: https://github.com/flang-compiler/f18/pull/70 Tree-same-pre-rewrite: false --- flang/lib/semantics/resolve-names.cc | 14 +++++++++++--- flang/test/semantics/resolve11.f90 | 5 ++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/flang/lib/semantics/resolve-names.cc b/flang/lib/semantics/resolve-names.cc index bd3c923ccf4a..70a9926a529b 100644 --- a/flang/lib/semantics/resolve-names.cc +++ b/flang/lib/semantics/resolve-names.cc @@ -927,10 +927,18 @@ bool ResolveNamesVisitor::Pre(const parser::AccessStmt &x) { // Set the access specification for this name. void ResolveNamesVisitor::SetAccess(const parser::Name &name, Attr attr) { Symbol &symbol{MakeSymbol(name)}; - if (symbol.attrs().HasAny({Attr::PUBLIC, Attr::PRIVATE})) { - Say(name, "The accessibility of '%s' has already been specified"_err_en_US); + Attrs &attrs{symbol.attrs()}; + if (attrs.HasAny({Attr::PUBLIC, Attr::PRIVATE})) { + // PUBLIC/PRIVATE already set: make it a fatal error if it changed + Attr prev = attrs.test(Attr::PUBLIC) ? Attr::PUBLIC : Attr::PRIVATE; + const auto &msg = attr == prev + ? "The accessibility of '%s' has already been specified as %s"_en_US + : "The accessibility of '%s' has already been specified as %s"_err_en_US; + Say(Message{name.source, + parser::MessageFormattedText{ + msg, name.ToString().c_str(), EnumToString(prev).c_str()}}); } else { - symbol.attrs().set(attr); + attrs.set(attr); } } diff --git a/flang/test/semantics/resolve11.f90 b/flang/test/semantics/resolve11.f90 index 88c0255718f0..9af6ceac4658 100644 --- a/flang/test/semantics/resolve11.f90 +++ b/flang/test/semantics/resolve11.f90 @@ -1,5 +1,8 @@ module m public i - !ERROR: The accessibility of 'i' has already been specified + integer, private :: j + !ERROR: The accessibility of 'i' has already been specified as PUBLIC private i + !The accessibility of 'j' has already been specified as PRIVATE + private j end