Skip to content

Commit

Permalink
[Flang] [Semantics] More descript warning message for same named exte…
Browse files Browse the repository at this point in the history
…rnal statements and interfaces

For issue: #56605. Previous error messages are not descriptive of problem. Issuing warnings instead that do not halt compilation but offer better description of problem.

Reviewed By: klausler

Differential Revision: https://reviews.llvm.org/D143426
  • Loading branch information
pscoro committed Feb 7, 2023
1 parent 4ce32d2 commit fe55e42
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 8 deletions.
31 changes: 24 additions & 7 deletions flang/lib/Semantics/resolve-names.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3911,11 +3911,19 @@ bool SubprogramVisitor::HandlePreviousCalls(
// ENTRY's name. We have to replace that symbol in situ to avoid the
// obligation to rewrite symbol pointers in the parse tree.
if (!symbol.test(subpFlag)) {
Say2(name,
subpFlag == Symbol::Flag::Function
? "'%s' was previously called as a subroutine"_err_en_US
: "'%s' was previously called as a function"_err_en_US,
symbol, "Previous call of '%s'"_en_US);
// External statements issue an explicit EXTERNAL attribute.
if (symbol.attrs().test(Attr::EXTERNAL) &&
!symbol.implicitAttrs().test(Attr::EXTERNAL)) {
// Warn if external statement previously declared.
Say(name,
"EXTERNAL attribute was already specified on '%s'"_warn_en_US);
} else {
Say2(name,
subpFlag == Symbol::Flag::Function
? "'%s' was previously called as a subroutine"_err_en_US
: "'%s' was previously called as a function"_err_en_US,
symbol, "Previous call of '%s'"_en_US);
}
}
EntityDetails entity;
if (proc->type()) {
Expand Down Expand Up @@ -4333,8 +4341,17 @@ bool DeclarationVisitor::Pre(const parser::ExternalStmt &x) {
for (const auto &name : x.v) {
auto *symbol{FindSymbol(name)};
if (!ConvertToProcEntity(DEREF(symbol))) {
SayWithDecl(
name, *symbol, "EXTERNAL attribute not allowed on '%s'"_err_en_US);
// Check if previous symbol is an interface.
if (auto *details{symbol->detailsIf<SubprogramDetails>()}) {
if (details->isInterface()) {
// Warn if interface previously declared.
Say(name,
"EXTERNAL attribute was already specified on '%s'"_warn_en_US);
}
} else {
SayWithDecl(
name, *symbol, "EXTERNAL attribute not allowed on '%s'"_err_en_US);
}
} else if (symbol->attrs().test(Attr::INTRINSIC)) { // C840
Say(symbol->name(),
"Symbol '%s' cannot have both INTRINSIC and EXTERNAL attributes"_err_en_US,
Expand Down
2 changes: 1 addition & 1 deletion flang/test/Semantics/resolve20.f90
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ subroutine forward
external :: a, b, c, d
!ERROR: EXTERNAL attribute not allowed on 'm'
external :: m
!ERROR: EXTERNAL attribute not allowed on 'foo'
!WARNING: EXTERNAL attribute was already specified on 'foo'
external :: foo
!ERROR: EXTERNAL attribute not allowed on 'bar'
external :: bar
Expand Down

0 comments on commit fe55e42

Please sign in to comment.