[flang-commits] [flang] f89d2be - [flang] Prioritize DATA object error messages a little better (#66258)
via flang-commits
flang-commits at lists.llvm.org
Mon Sep 18 12:49:38 PDT 2023
Author: Peter Klausler
Date: 2023-09-18T12:49:33-07:00
New Revision: f89d2beb23f02e7f0c197e18bd2d746555f2df26
URL: https://github.com/llvm/llvm-project/commit/f89d2beb23f02e7f0c197e18bd2d746555f2df26
DIFF: https://github.com/llvm/llvm-project/commit/f89d2beb23f02e7f0c197e18bd2d746555f2df26.diff
LOG: [flang] Prioritize DATA object error messages a little better (#66258)
When a DATA statement object is not valid, there's a number of possible
reasons. Emit an error message for the most egregious violation, so that
an unlucky user doesn't fix something easy (due to a less-severe error
message masking one that is worse) and then run into something that
might be more serious.
Added:
flang/test/Semantics/data18.f90
Modified:
flang/lib/Semantics/check-data.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/check-data.cpp b/flang/lib/Semantics/check-data.cpp
index 72e021d03a96974..fe9b2fd222827fe 100644
--- a/flang/lib/Semantics/check-data.cpp
+++ b/flang/lib/Semantics/check-data.cpp
@@ -58,21 +58,24 @@ class DataVarChecker : public evaluate::AllTraverse<DataVarChecker, true> {
const Scope &scope{context_.FindScope(source_)};
bool isFirstSymbol{isFirstSymbol_};
isFirstSymbol_ = false;
- if (const char *whyNot{IsAutomatic(symbol) ? "Automatic variable"
- : IsDummy(symbol) ? "Dummy argument"
- : IsFunctionResult(symbol) ? "Function result"
- : IsAllocatable(symbol) ? "Allocatable"
+ // Ordered so that most egregious errors are first
+ if (const char *whyNot{IsProcedure(symbol) && !IsPointer(symbol)
+ ? "Procedure"
+ : isFirstSymbol && IsHostAssociated(symbol, scope)
+ ? "Host-associated object"
+ : isFirstSymbol && IsUseAssociated(symbol, scope)
+ ? "USE-associated object"
+ : IsDummy(symbol) ? "Dummy argument"
+ : IsFunctionResult(symbol) ? "Function result"
+ : IsAutomatic(symbol) ? "Automatic variable"
+ : IsAllocatable(symbol) ? "Allocatable"
: IsInitialized(symbol, true /*ignore DATA*/,
true /*ignore allocatable components*/,
true /*ignore uninitialized pointer components*/)
? "Default-initialized"
- : IsProcedure(symbol) && !IsPointer(symbol) ? "Procedure"
- // remaining checks don't apply to components
- : !isFirstSymbol ? nullptr
- : IsHostAssociated(symbol, scope) ? "Host-associated object"
- : IsUseAssociated(symbol, scope) ? "USE-associated object"
: symbol.has<AssocEntityDetails>() ? "Construct association"
- : IsPointer(symbol) && (hasComponent_ || hasSubscript_)
+ : isFirstSymbol && IsPointer(symbol) &&
+ (hasComponent_ || hasSubscript_)
? "Target of pointer"
: nullptr}) {
context_.Say(source_,
diff --git a/flang/test/Semantics/data18.f90 b/flang/test/Semantics/data18.f90
new file mode 100644
index 000000000000000..e278c537cd8b593
--- /dev/null
+++ b/flang/test/Semantics/data18.f90
@@ -0,0 +1,59 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+! Test error message priorities for DATA problems
+module m
+ integer useAlloc
+ allocatable useAlloc
+ integer, pointer :: usePtr(:)
+ contains
+ subroutine useProc
+ end
+end
+function f(hostDummy, hostProc) result(hostResult)
+ integer hostDummy, hostResult
+ external hostProc
+ integer hostAuto(hostDummy)
+ integer, allocatable :: hostAlloc
+ integer :: hostInit = 1
+ integer, pointer :: hostPtr(:)
+ contains
+ subroutine test(innerDummy, innerProc)
+ use m
+ external innerProc
+ integer innerAuto(innerDummy)
+ integer, allocatable :: innerAlloc
+ integer :: innerInit = 1
+ integer, pointer :: innerPtr(:)
+ !ERROR: Procedure 'useproc' must not be initialized in a DATA statement
+ data useProc/0/
+ !ERROR: Procedure 'hostproc' must not be initialized in a DATA statement
+ data hostProc/0/
+ !ERROR: Procedure 'innerproc' must not be initialized in a DATA statement
+ data innerProc/0/
+ !ERROR: Host-associated object 'hostdummy' must not be initialized in a DATA statement
+ data hostDummy/1/
+ !ERROR: Host-associated object 'hostresult' must not be initialized in a DATA statement
+ data hostResult/1/
+ !ERROR: Host-associated object 'hostauto' must not be initialized in a DATA statement
+ data hostAuto/1/
+ !ERROR: Host-associated object 'hostalloc' must not be initialized in a DATA statement
+ data hostAlloc/1/
+ !ERROR: Host-associated object 'hostinit' must not be initialized in a DATA statement
+ data hostInit/1/
+ !ERROR: Host-associated object 'hostptr' must not be initialized in a DATA statement
+ data hostPtr(1)/1/
+ !ERROR: USE-associated object 'usealloc' must not be initialized in a DATA statement
+ data useAlloc/1/
+ !ERROR: USE-associated object 'useptr' must not be initialized in a DATA statement
+ data usePtr(1)/1/
+ !ERROR: Dummy argument 'innerdummy' must not be initialized in a DATA statement
+ data innerDummy/1/
+ !ERROR: Automatic variable 'innerauto' must not be initialized in a DATA statement
+ data innerAuto/1/
+ !ERROR: Allocatable 'inneralloc' must not be initialized in a DATA statement
+ data innerAlloc/1/
+ !ERROR: Default-initialized 'innerinit' must not be initialized in a DATA statement
+ data innerInit/1/
+ !ERROR: Target of pointer 'innerptr' must not be initialized in a DATA statement
+ data innerptr(1)/1/
+ end
+end
More information about the flang-commits
mailing list