Commit Graph

276 Commits

Author SHA1 Message Date
Kiran Chandramohan
8acae1a88b [Flang][OpenMP] Add source range for a few directives
The sourcerange was missing for a few directives when
they were the first directive to appear in a program
without a program statement.

Reviewed By: DavidTruby

Differential Revision: https://reviews.llvm.org/D153634
2023-07-05 13:27:52 +00:00
Peter Klausler
39dd4ebd2b [flang] Prevent lowering crash by properly updating symbol pointer
Kind of an edge case.  When a MODULE FUNCTION or SUBROUTINE
interface is defined by a MODULE PROCEDURE in the same program
unit, ensure that the symbol table pointer in the parse tree is
updated to point to the SubprogramDetails symbol for the
interface, and not left pointing to what should soon become
a dead SubprogramNameDetails symbol.

Differential Revision: https://reviews.llvm.org/D154380
2023-07-03 12:10:49 -07:00
Jean Perier
2d46264ca6 [flang] add nested DEC STRUCTURE in DerivedTypeDetails component names
Currently, when a (legacy) DEC structure contained other DEC structure
declarations, the related component names were not added to the
containing DerivedTypeDetails component_names. This lead to bugs in
later phase when visiting the components (like in when lowering the
type to FIR/MLIR).

When an EntityDecl is visited and the scope is a DEC structure, add
the entity to the component names of this DEC structure.

Differential Revision: https://reviews.llvm.org/D154216
2023-06-30 20:25:04 +02:00
Peter Klausler
918a6bb88a [flang] Fix bug with generic and homonymous specific module procedure
An unconditional EraseSymbol() call was deleting a generic interface symbol
when the generic had a module procedure of the same name as a specific
procedure, and the module procedure's definition appeared in the same
module.  Also clean up some applications of the MODULE attribute to
symbols created along the way.

Differential Revision: https://reviews.llvm.org/D153478
2023-06-22 07:46:33 -07:00
Peter Klausler
ce8effc88a [flang] Fix USE with homonymous renaming
Fortran requires that a USE with renaming prevent the USE'd symbol
from also being associated into a scope without renaming.  The
implementation in name resolution gets confused in the case of
a USE with renaming using the same name ("x => x").  Clean things
up.  Fixes LLVM bug https://github.com/llvm/llvm-project/issues/63397.

Differential Revision: https://reviews.llvm.org/D153452
2023-06-22 07:35:12 -07:00
Peter Klausler
3d7c8367ef [flang] Rework name resolution of Cray pointer declarations
The current code has redundancy with the infrastructure for
declaration checking that can be replaced by better usage of
the parse tree walking framework.  This also fixes LLVM flang
bug #58971.

Differential Revision: https://reviews.llvm.org/D153385
2023-06-22 06:35:42 -07:00
Peter Klausler
d4da4934c3 wip 2023-06-22 06:35:41 -07:00
Kelvin Li
7e82379d11 [flang] rename PPC specific intrinsic modules (NFC) 2023-06-14 11:21:03 -04:00
Kelvin Li
a9e1d2e760 [flang] Add PowerPC vec_add, vec_and, vec_mul, vec_sub and vec_xor intrinsics
Differential Revision: https://reviews.llvm.org/D151857
2023-06-13 16:05:21 -04:00
Peter Klausler
f674ddc19f [flang] CUDA Fortran - part 5/5: statement semantics
Canonicalize !$CUF KERNEL DO loop nests, similar to OpenACC/OpenMP
canonicalization.  Check statements and expressions in device contexts
for usage that isn't supported.  Add more tests, and include some
tweaks to standard modules needed to build CUDA Fortran modules.

Depends on https://reviews.llvm.org/D150159,
https://reviews.llvm.org/D150161, https://reviews.llvm.org/D150162, &
https://reviews.llvm.org/D150163.

Differential Revision: https://reviews.llvm.org/D150164
2023-06-01 13:31:35 -07:00
Peter Klausler
27f71807da [flang] CUDA Fortran - part 2/5: symbols & scopes
Add representations of CUDA Fortran data and subprogram attributes
to the symbol table and scopes of semantics.  Set them in name
resolution, and emit them to module files.

Depends on https://reviews.llvm.org/D150159.

Differential Revision: https://reviews.llvm.org/D150161
2023-05-31 10:19:32 -07:00
Peter Klausler
4ad7279392 [flang] CUDA Fortran - part 1/5: parsing
Begin upstreaming of CUDA Fortran support in LLVM Flang.

This first patch implements parsing for CUDA Fortran syntax,
including:
 - a new LanguageFeature enum value for CUDA Fortran
 - driver change to enable that feature for *.cuf and *.CUF source files
 - parse tree representation of CUDA Fortran syntax
 - dumping and unparsing of the parse tree
 - the actual parsers for CUDA Fortran syntax
 - prescanning support for !@CUF and !$CUF
 - basic sanity testing via unparsing and parse tree dumps

... along with any minimized changes elsewhere to make these
work, mostly no-op cases in common::visitors instances in
semantics and lowering to allow them to compile in the face
of new types in variant<> instances in the parse tree.

Because CUDA Fortran allows the kernel launch chevron syntax
("call foo<<<blocks, threads>>>()") only on CALL statements and
not on function references, the parse tree nodes for CallStmt,
FunctionReference, and their shared Call were rearranged a bit;
this caused a fair amount of one-line changes in many files.

More patches will follow that implement CUDA Fortran in the symbol
table and name resolution, and then semantic checking.

Differential Revision: https://reviews.llvm.org/D150159
2023-05-31 09:48:59 -07:00
Kelvin Li
ef93417470 [flang] Support for PowerPC vector type
The following PowerPC vector type syntax is added:

  VECTOR ( element-type-spec )

where element-type-sec is integer-type-spec, real-type-sec or unsigned-type-spec.

Two opaque types (__VECTOR_PAIR and __VECTOR_QUAD) are also added.

A finite set of functionalities are implemented in order to support the new types:
1. declare objects
2. declare function result
3. declare type dummy arguments
4. intrinsic assignment between the new type objects (e.g. v1=v2)
5. reference functions that return the new types

Submit on behalf of @tislam @danielcchen

Authors: @tislam @danielcchen

Differential Revision: https://reviews.llvm.org/D150876
2023-05-24 13:10:56 -04:00
Peter Klausler
3d05ab6d3e [flang] Better error handling and testing of generics with homonymous specifics or derived types
Fortran allows a generic procedure interface to have the same name as a derived
type in the same scope or the same name as one of its specific procedures.
(It can't have both since a derived type and specific procedure can't have the
same name in a scope.)

Some popular compilers allow generic interfaces with distinct accessible homonymous
specific procedures to be merged by USE association.  Thsi compiler does not,
and for good reason: it leads to ambiguity in cases where a procedure name appears
outside a reference, such as in a PROCEDURE declaration statement as the procedure's
interface, the target of a procedure pointer assignment statement, or as an
actual argument.

This patch cleans up the code that handles these cases, improves some error
messages, and adds more tests.

Resolves https://github.com/llvm/llvm-project/issues/60228.

Differential Revision: https://reviews.llvm.org/D150915
2023-05-22 12:03:36 -07:00
Peter Klausler
c32d5458b5 [flang] Don't complain about dummy subroutine under IMPLICIT NONE
The compiler emits a bogus 'No explicit type declared for...' error
when a dummy procedure turns out to be a subroutine (or at least not
a function or object) under control of IMPLICIT NONE.

Fixes https://github.com/llvm/llvm-project/issues/60224

Differential Revision: https://reviews.llvm.org/D150814
2023-05-18 14:03:28 -07:00
Peter Klausler
b0cea8941c [flang] Allow redudant attributes on use-/host- associated names
Constraint C815 in F'2018 allows a name to acquire an attribute at
most once per scope.  For some attributes, the attribute may have
already been inherited, and the compiler was emitting a bogus error
message for a redundant application of the same attribute in another
scope.

Fixes https://github.com/llvm/llvm-project/issues/60274

Differential Revision: https://reviews.llvm.org/D150819
2023-05-18 12:07:25 -07:00
Peter Klausler
98d1d528d1 [flang] Fix bogus error under IMPLICIT NONE(EXTERNAL)
Don't emit an error message for a possible implicit use of an
external procedure when it is known that the symbol is not
a procedure (e.g., an array).

Fixes https://github.com/llvm/llvm-project/issues/62047

Differential Revision: https://reviews.llvm.org/D150789
2023-05-18 11:53:29 -07:00
Peter Klausler
191d48723f [flang] Finer control over warnings
Establish a set of optional usage warnings, and enable some
only in "-pedantic" mode that, in our subjective experience
with application codes, seem to issue frequently without
indicating usage that really needs to be corrected.  By default,
with this patch the compiler should appear to be somewhat less
persnickety but not less informative.

Differential Revision: https://reviews.llvm.org/D150710
2023-05-16 13:56:24 -07:00
Peter Klausler
689de4c675 [flang] Apply default module accessibility rules a second time (bug#62598)
Apply the default PUBLIC/PRIVATE accessibility of a module to its symbols
a second time after it is known that all symbols, including implicitly typed
names from NAMELIST groups and specification expressions in module subprograms,
have been created in its scope.

Fixes https://github.com/llvm/llvm-project/issues/62598.

Differential Revision: https://reviews.llvm.org/D150307
2023-05-16 10:19:00 -07:00
Raghu Maddhipatla
d6ef90f64c [OpenMP][Flang][Semantics] Add semantics support for USE_DEVICE_PTR clause on OMP TARGET DATA directive.
Initial support for USE_DEVICE_PTR clause on OMP TARGET DATA directive.

Reviewed By: kiranchandramohan

Differential Revision: https://reviews.llvm.org/D148254
2023-04-26 20:17:12 -05:00
Peter Klausler
864cb2aa45 [flang] Semantics for !DIR$ IGNORE_TKR
Implement semantics for the IGNORE_TKR directive as it is interpreted
by the PGI / NVFORTRAN compiler.

Differential Revision: https://reviews.llvm.org/D148643
2023-04-19 09:39:37 -07:00
Peter Klausler
32a793b687 [flang] Resolve USE vs IMPORT conflicts
When the same name is pulled into a scope more than once via
USE and IMPORT, emit an error if its resolutions are ambiguous,
or (as an extension like some other compilers) emit a portability
warning when the names all resolve to the same symbol.

Differential Revision: https://reviews.llvm.org/D147388
2023-04-03 08:50:49 -07:00
Peter Klausler
3f6e0c24e6 [flang] Move SAVE attribute checks to declaration checking
Constraint checking for explicit SAVE attributes is more
accurate when done along with other declaration checking, rather
than on the fly during name resolution.  This allows us to
catch attempts to attach explicit SAVE attributes to anything
that can't have one (constraints C859, C860).

Also delete `IsSave()`, whose few remaining uses were changed to the
more general `IsSaved()` predicate that seems more correct for
those uses, returning true for both explicit and implied SAVE
attributes.

Differential Revision: https://reviews.llvm.org/D146579
2023-03-27 15:53:44 -07:00
Peter Klausler
51d48a3e66 [flang] Reimplement C1406 check as a warning
Constraint C1406 in Fortran 2018 prohibits the USE of the same module
name as both an intrinsic module and a non-intrinsic module in a scope.
The current check misinterprets the constraint as applying only to
explicitly INTRINSIC or NON_INTRINSIC module natures.

Change the check to also apply to non-explicit module natures, and
also downgrade it to a portability warning, since there is no ambiguity
and I suspect that we need to accept this usage when building f18's
own intrinsic modules.

Differential Revision: https://reviews.llvm.org/D146576
2023-03-27 15:43:09 -07:00
Peter Klausler
fd4c958dc5 [flang] Correct handling of USE-associated generic override in nested scope
As the new test here shows by failing with the current compiler with
a bogus error message about indistinguishable specific procedures in
a generic interface, name resolution needs to take care to not
copy a USE-associated generic into the current scope for extension
when the USE association is actually into an enclosing scope.

Differential Revision: https://reviews.llvm.org/D145750
2023-03-10 09:59:38 -08:00
Peter Klausler
17f32bdd37 [flang] Fix checking of TBP bindings
Non-DEFERRED procedure binding checking can't blindly accept
all procedures defined in modules -- they can't be ABSTRACT
interfaces.  And GetUltimate() must be used rather than
FindSubprogram(); the latter will resolve to a procedure's
interface in the case of "procedure(interface) :: external",
not "external".

Differential Revision: https://reviews.llvm.org/D145749
2023-03-10 09:59:06 -08:00
Peter Klausler
d38765604f [flang] Forward references to COMMON from specification expr under IMPLICIT NONE
As a near-universal extension, Fortran compilers permit forward references
to dummy arguments and variables in COMMON blocks from specification expressions
before an explicit type-declaration-stmt appears for those variables
under IMPLICIT NONE, so long as those variables are later explicitly typed
with the types that regular implicit typing rules would have given them
(usually default INTEGER).

F18 implemented this extension for dummy arguments, but not variables in
COMMON blocks.  Extend the extension to also accept variables in COMMON.

Differential Revision: https://reviews.llvm.org/D145743
2023-03-10 09:19:52 -08:00
Peter Klausler
057b6fb61f [flang] Fix CONTIGUOUS attribute for construct entities
Currently, the selector of a construct entity (e.g., ASSOCIATE(x=>a(1:20)))
is inheriting the CONTIGUOUS attribute from its associated variable
even if it has subscripts that make it noncontiguous (a(1:20:2)).
Add construct entities to the dynamic contiguity predicate instead.

Differential Revision: https://reviews.llvm.org/D145114
2023-03-02 14:06:37 -08:00
Peter Klausler
a183668ac6 [flang] Move check for statement function in BLOCK construct
A BLOCK construct may not contain a statement function definition;
but it may of course contain an assignment statement with an array
element on its left-hand side that looks like a statement function
definition.  These misparsed statement functions are converted
into assignment statements during semantics once it is clear what
they are.  Move the C1107 check for a statement function definition
in a block construct into declaration checking, which is where it
probably should have been in the first place anyway.

Differential Revision: https://reviews.llvm.org/D145112
2023-03-02 13:48:09 -08:00
Peter Klausler
2216c4c6a4 [flang] Catch name conflict between generic TBP and inherited non-generic
A generic procedure binding in an extended derived type may not have the
same name as a symbol inherited from an ancestor type unless that inherited
symbol is also a generic TBP.  Since generic names can be things like
"ASSIGNMENT(=)", name resolution doesn't use OkToAddComponent() for
generic TBPs, which would have caught this error as it does for other
symbols in derived types, so it must be special-cased.

Differential Revision: https://reviews.llvm.org/D145109
2023-03-02 10:10:37 -08:00
Peter Klausler
69e2665c8b [flang] BIND(C,NAME=...) corrections
The Fortran standard's various restrictions on the use of BIND(C)
often depend more on the presence or absence of an explicit NAME=
specification rather than on its value, but semantics and module
file generation aren't making distinctions between explicit NAME=
specifications that happen to match the default name and declarations
that don't have NAME=.  Tweak semantics and module file generation
to conform, and also complain when named BIND(C) attributes are
erroneously applied to entities that can't support them, like
ABSTRACT interfaces.

Differential Revision: https://reviews.llvm.org/D145107
2023-03-02 10:10:06 -08:00
Kelvin Li
838a4d348d [Flang] Add PowerPC intrinsics
This patch adds a subset of PowerPC intrinsics - fmadd,
fmsub, fnmadd and fnmsub.

Differential Revision: https://reviews.llvm.org/D143951
2023-02-18 11:56:03 -05:00
Leandro Lupori
1fae1464d7 [flang] Fix USE rename
Fix USE rename when use-name and local-name are the same.
Previously, the associated symbol was being removed from scope.

Operator rename implementation needed no change, because, as it
doesn't call AddUseRename(), symbol erasure is skipped.

Fixes #60223

Reviewed By: klausler

Differential Revision: https://reviews.llvm.org/D143933
2023-02-14 10:04:56 -03:00
Peter Klausler
cff7fad154 [flang] Catch repeated BIND(C) attribute specifications for a symbol
A BIND(C) attribute statement or type-declaration-stmt attribute, just
like most attributes, can only appear once.  Name resolution was excluding
the BIND(C) attribute from its check for duplicated attributes, but I
don't see a reason that remains to do so.

Differential Revision: https://reviews.llvm.org/D143834
2023-02-13 18:07:16 -08:00
Peter Klausler
176ee268f8 [flang] Allow for user-defined intrinsic operators (regression)
The recent code that uses an iterative rather than recursive walk
over the parse tree when processing expressions needs to allow for
the rare case in which an intrinsic operator (e.g., +) is extended
by a generic interface in the program.

Differential Revision: https://reviews.llvm.org/D143818
2023-02-13 09:24:11 -08:00
Leandro Lupori
7eec2f2f21 [flang] Avoid infinite recursion in common block check
Don't call CheckCommonBlockDerivedType() recursively if the
derived type symbol is the same symbol that is already being
processed. This can happen when a component is a pointer of the
same type as its parent component, for instance.

Fixes #60230

Reviewed By: klausler

Differential Revision: https://reviews.llvm.org/D143211
2023-02-13 10:48:32 -03:00
Peter Klausler
2e4499e749 [flang] Handle forward references to modules
When a USE of a module precedes its definition in the same source
file, ensure that the module is processed by name resolution before
the USE statement.  This prevents the risk of the USE statement using
an obsolete module file that is later overwritten during the same
compilation.

Differential Revision: https://reviews.llvm.org/D143799
2023-02-12 18:41:35 -08:00
Peter Klausler
594700c122 [flang] Warn about construct names that are not distinct in the inclusive scope
f18 implements BLOCK scoping for construct names, like most but not all Fortran
compilers, but in the 2018 standard such names are defined to be local identifiers
whose scope is the inclusive scope -- i.e., the subprogram or main program.
Detect usage that depends on this extension and emit a portability warning.

Differential Revision: https://reviews.llvm.org/D143776
2023-02-12 11:42:38 -08:00
Paul Scoropan
fe55e42eff [Flang] [Semantics] More descript warning message for same named external statements and interfaces
For issue: https://github.com/llvm/llvm-project/issues/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
2023-02-07 16:03:40 +00:00
Peter Klausler
3077d61462 [flang] Check for global name conflicts (19.2)
Global names should be checked for conflicts even when not BIND(C).

Differential Revision: https://reviews.llvm.org/D142761
2023-02-01 13:24:16 -08:00
Peter Klausler
05e62db293 [flang] Catch bad inquiries in specification expressions
When a descriptor inquiry or inquiry function's result is
not constant and is known to be impossible to correctly determine
at runtime, raise an error.  For example, LEN(X) when X is
a local allocatable variable with deferred length.

Differential Revision: https://reviews.llvm.org/D142759
2023-02-01 12:49:20 -08:00
Peter Klausler
1b92478300 [flang] Catch statement function typing error
Emit an error message when the right-hand side expression of a statement function
definition cannot be converted to the type of the statement function.

Differential Revision: https://reviews.llvm.org/D142745
2023-02-01 11:19:19 -08:00
Peter Klausler
fac00d1b5d [flang] Fix ENUMERATOR declarations in nested scopes
ENUMERATOR declarations are checking for conflicts between new
enumerator names and names in both the local scope and scopes
that contain it.  ENUMERATOR declarations belong to the local
scope and so only a conflict with a name therein is an error.
(In short, use FindInScope rather than FindSymbol.)

Differential Revision: https://reviews.llvm.org/D142773
2023-01-29 15:55:26 -08:00
Peter Klausler
034bab4cc8 [flang] Diagnose invalid initializations
f18 current ignores attempts to initialize (with =expr) things
that are not objects, or allows meaningless initializations of
things that have mistakenly been promoted to be objects.
Fix by refusing to promote to objects names that have any
attributes that cannot be applied to objects, and then catch
data initializations of symbols that are not objects.

Differential Revision: https://reviews.llvm.org/D142766
2023-01-28 17:00:28 -08:00
Peter Klausler
2d528fd7d7 [flang] Warn about defined operator with too few/many dummy arguments
A function in a defined operator generic interface will syntactically
have one or two arguments.  If a defined operator includes a specific
function with 0 or more than 2 dummy arguments, there's no way that it
could be invoked by way of the interface.  Emit a warning.

Differential Revision: https://reviews.llvm.org/D142762
2023-01-28 10:15:35 -08:00
Peter Klausler
ebd85ae285 [flang] Enforce ENTRY dummy argument usage restriction
A dummy argument that appears only in ENTRY statements may
not be used in the executable part prior to its first ENTRY
statement.

Differential Revision: https://reviews.llvm.org/D142758
2023-01-28 09:27:00 -08:00
Peter Klausler
f7be1aadf2 [flang] Prohibit multiple separate module procedure definitions
Ensure that non-BIND(C) separate module procedures are not
defined more than once.

Differential Revision: https://reviews.llvm.org/D142750
2023-01-27 14:34:03 -08:00
Peter Klausler
7db05ae14d [flang] Fix crash in name resolution
In an error recovery situation, the name resolution code for a
SELECT TYPE statement must check the presence of an optional
expression before calling GetType() upon it.

Differential Revision: https://reviews.llvm.org/D140153
2022-12-17 17:23:52 -08:00
Peter Klausler
635656f4ff [flang] Expunge needless semantics::ProcInterface
The ProcInterface structure is used only by ProcEntityDetails; it represents
what a program might have put in parentheses in a procedure-declaration-stmt,
either the name of a procedure interface or a declaration-type-spec.

If a procedure entity has an implicit interface, the function result
type (if any) can be kept in EntityDetails::type_, which already exists
and is currently redundant for ProcEntityDetails symbols.

All that is really needed is a nullable Symbol pointer in ProcEntityDetails
to point to the procedure's explicit interface, when it has one.

Also, catch the case where a procedure has an explicit interface
and a program attempts to also give it a type.

Differential Revision: https://reviews.llvm.org/D140134
2022-12-16 10:44:29 -08:00
Peter Klausler
6f6af76b84 [flang] Catch bad usage of POINTER attribute
Most attributes apply to only object or only procedure entities,
and attempts to apply them to other kinds of symbol table entries
are caught in name resolution when ConvertToObjectEntity() or
ConvertToProcEntity() fails.  However, the POINTER attribute can
be applied to both, and name resolution can't perform that conversion
yet, and as a result we don't catch many kinds of silly errors.
Fix by ensuring that the symbol is of a type that could eventually
become an object or procedure entity if it is not one already.

Differential Revision: https://reviews.llvm.org/D140137
2022-12-16 09:04:54 -08:00