|
Revision tags: llvmorg-20.1.0, llvmorg-20.1.0-rc3, llvmorg-20.1.0-rc2, llvmorg-20.1.0-rc1, llvmorg-21-init, llvmorg-19.1.7, llvmorg-19.1.6, llvmorg-19.1.5, llvmorg-19.1.4, llvmorg-19.1.3, llvmorg-19.1.2, llvmorg-19.1.1, llvmorg-19.1.0, llvmorg-19.1.0-rc4, llvmorg-19.1.0-rc3, llvmorg-19.1.0-rc2, llvmorg-19.1.0-rc1, llvmorg-20-init, llvmorg-18.1.8, llvmorg-18.1.7, llvmorg-18.1.6, llvmorg-18.1.5, llvmorg-18.1.4, llvmorg-18.1.3, llvmorg-18.1.2, llvmorg-18.1.1, llvmorg-18.1.0, llvmorg-18.1.0-rc4, llvmorg-18.1.0-rc3, llvmorg-18.1.0-rc2, llvmorg-18.1.0-rc1, llvmorg-19-init, llvmorg-17.0.6, llvmorg-17.0.5, llvmorg-17.0.4, llvmorg-17.0.3, llvmorg-17.0.2, llvmorg-17.0.1, llvmorg-17.0.0, llvmorg-17.0.0-rc4, llvmorg-17.0.0-rc3, llvmorg-17.0.0-rc2, llvmorg-17.0.0-rc1, llvmorg-18-init, llvmorg-16.0.6, llvmorg-16.0.5, llvmorg-16.0.4, llvmorg-16.0.3, llvmorg-16.0.2, llvmorg-16.0.1, llvmorg-16.0.0, llvmorg-16.0.0-rc4, llvmorg-16.0.0-rc3, llvmorg-16.0.0-rc2, llvmorg-16.0.0-rc1, llvmorg-17-init, llvmorg-15.0.7, llvmorg-15.0.6, llvmorg-15.0.5, llvmorg-15.0.4, llvmorg-15.0.3, llvmorg-15.0.2, llvmorg-15.0.1, llvmorg-15.0.0, llvmorg-15.0.0-rc3, llvmorg-15.0.0-rc2, llvmorg-15.0.0-rc1, llvmorg-16-init, llvmorg-14.0.6, llvmorg-14.0.5, llvmorg-14.0.4 |
|
| #
0a79113b |
| 20-May-2022 |
Peter Klausler <[email protected]> |
[flang] Replace crash and improve a semantics TODO message
The derived type information table construction code had a crash whose root cause was replacing an expression with one of its operands -- t
[flang] Replace crash and improve a semantics TODO message
The derived type information table construction code had a crash whose root cause was replacing an expression with one of its operands -- the deletion of the LHS of that assignment led to the RHS being invalidated before it could be read. Fix by cloning the RHS. Also update a TODO message to the new "_todo_en_US" message class and add a comment about how it should be resolved.
Differential Revision: https://reviews.llvm.org/D126154
show more ...
|
|
Revision tags: llvmorg-14.0.3, llvmorg-14.0.2, llvmorg-14.0.1 |
|
| #
cd03e96f |
| 23-Mar-2022 |
Peter Klausler <[email protected]> |
[flang] Add & use a better visit() (take 2)
Adds flang/include/flang/Common/log2-visit.h, which defines a Fortran::common::visit() template function that is a drop-in replacement for std::visit().
[flang] Add & use a better visit() (take 2)
Adds flang/include/flang/Common/log2-visit.h, which defines a Fortran::common::visit() template function that is a drop-in replacement for std::visit(). Modifies most use sites in the front-end and runtime to use common::visit().
The C++ standard mandates that std::visit() have O(1) execution time, which forces implementations to build dispatch tables. This new common::visit() is O(log2 N) in the number of alternatives in a variant<>, but that N tends to be small and so this change produces a fairly significant improvement in compiler build memory requirements, a 5-10% improvement in compiler build time, and a small improvement in compiler execution time.
Building with -DFLANG_USE_STD_VISIT causes common::visit() to be an alias for std::visit().
Calls to common::visit() with multiple variant arguments are referred to std::visit(), pending further work.
This change is enabled only for GCC builds with GCC >= 9; an earlier attempt (D122441) ran into bugs in some versions of clang and was reverted rather than simply disabled; and it is not well tested with MSVC. In non-GCC and older GCC builds, common::visit() is simply an alias for std::visit().
show more ...
|
| #
4ca111d4 |
| 28-Mar-2022 |
Andrzej Warzynski <[email protected]> |
Revert "[flang] Add & use a better visit()"
This reverts commit 2ab9990c9eb79682a4d4b183dfbc7612d3e55328. It has caused multiple build failures: * https://lab.llvm.org/buildbot/#/builders/177/build
Revert "[flang] Add & use a better visit()"
This reverts commit 2ab9990c9eb79682a4d4b183dfbc7612d3e55328. It has caused multiple build failures: * https://lab.llvm.org/buildbot/#/builders/177/builds/4346 * https://lab.llvm.org/buildbot/#/builders/180/builds/3803 * https://lab.llvm.org/buildbot/#/builders/175/builds/10419 * https://lab.llvm.org/buildbot/#/builders/191/builds/4318 * https://lab.llvm.org/buildbot/#/builders/173/builds/4274 * https://lab.llvm.org/buildbot/#/builders/181/builds/4297
All these bots failed with a time-out: ``` command timed out: 1200 seconds without output running [b'ninja', b'-j', b'32'], attempting to kill ``` I'm guessing that that's due to template instantiations failing at some point (https://reviews.llvm.org/D122441 introduced a custom implementation of std::visit). Everything seems fine when either: * building on X86 with GCC or Clang (tested with GCC 9.3 and Clang 12) * building on AArch64 with GCC (tested with GCC 11)
show more ...
|
| #
2ab9990c |
| 23-Mar-2022 |
Peter Klausler <[email protected]> |
[flang] Add & use a better visit()
Adds flang/include/flang/Common/visit.h, which defines a Fortran::common::visit() template function that is a drop-in replacement for std::visit(). Modifies most
[flang] Add & use a better visit()
Adds flang/include/flang/Common/visit.h, which defines a Fortran::common::visit() template function that is a drop-in replacement for std::visit(). Modifies most use sites in the front-end and runtime to use common::visit().
The C++ standard mandates that std::visit() have O(1) execution time, which forces implementations to build dispatch tables. This new common::visit() is O(log2 N) in the number of alternatives in a variant<>, but that N tends to be small and so this change produces a fairly significant improvement in compiler build memory requirements, a 5-10% improvement in compiler build time, and a small improvement in compiler execution time.
Building with -DFLANG_USE_STD_VISIT causes common::visit() to be an alias for std::visit().
Calls to common::visit() with multiple variant arguments are referred to std::visit(), pending further work.
Differential Revision: https://reviews.llvm.org/D122441
show more ...
|
| #
ca46521a |
| 24-Mar-2022 |
Jean Perier <[email protected]> |
[flang] UBOUND() edge case: empty dimension
Similarly to LBOUND in https://reviews.llvm.org/D121488, UBOUND must return zero for an empty dimension, no matter the specification expression.
Add a Ge
[flang] UBOUND() edge case: empty dimension
Similarly to LBOUND in https://reviews.llvm.org/D121488, UBOUND must return zero for an empty dimension, no matter the specification expression.
Add a GetUBOUND method to be used in expression rewrite that prevents folding UBOUND to a bound specification expression if the extent is not a compile time constant.
Fold the case where the extents is known to be zero (and also deal with this case in LBOUND since we can and should to comply with constant expression requirements).
Differential Revision: https://reviews.llvm.org/D122242
show more ...
|
|
Revision tags: llvmorg-14.0.0, llvmorg-14.0.0-rc4, llvmorg-14.0.0-rc3 |
|
| #
3b61587c |
| 09-Mar-2022 |
Peter Klausler <[email protected]> |
[flang] LBOUND() edge case: empty dimension
LBOUND must return 1 for an empty dimension, no matter what explicit expression might appear in a declaration or arrive in a descriptor.
Differential Rev
[flang] LBOUND() edge case: empty dimension
LBOUND must return 1 for an empty dimension, no matter what explicit expression might appear in a declaration or arrive in a descriptor.
Differential Revision: https://reviews.llvm.org/D121488
show more ...
|
| #
f2da8f5e |
| 11-Mar-2022 |
Jean Perier <[email protected]> |
[flang][NFC] rename IsKindParameterizedDerivedType and fix comment typos
Following post-review feedback on https://reviews.llvm.org/D120804 and https://reviews.llvm.org/D120801 about type descriptor
[flang][NFC] rename IsKindParameterizedDerivedType and fix comment typos
Following post-review feedback on https://reviews.llvm.org/D120804 and https://reviews.llvm.org/D120801 about type descriptor changes, fix typos in comments and rename IsKindParameterizedDerivedType to IsDerivedTypeWithKindParameter. Remove a useless `;`.
Reviewed By: clementval, PeteSteinfeld
Differential Revision: https://reviews.llvm.org/D121470
show more ...
|
| #
06be1488 |
| 03-Mar-2022 |
Andrzej Warzynski <[email protected]> |
[flang][nfc] Fix GCC 11 build
After merging https://reviews.llvm.org/D120801, Flang no longer builds with GCC 11: ``` ../llvm-project/flang/lib/Semantics/runtime-type-info.cpp:385:22: error: variabl
[flang][nfc] Fix GCC 11 build
After merging https://reviews.llvm.org/D120801, Flang no longer builds with GCC 11: ``` ../llvm-project/flang/lib/Semantics/runtime-type-info.cpp:385:22: error: variable ‘lenParam’ set but not used [-Werror=unused-but-set-variable] 385 | for (SymbolRef lenParam : *lenParameters) { | ^~~~~~~~ ```
I'm sending this without a review as a quick fix.
show more ...
|
| #
f88a9497 |
| 03-Mar-2022 |
Jean Perier <[email protected]> |
[flang] Generate PDT runtime type info in the type definition scope
This patches modifies PDT runtime type info generation so that it is easier to handle derived type descriptor in lowering. It chan
[flang] Generate PDT runtime type info in the type definition scope
This patches modifies PDT runtime type info generation so that it is easier to handle derived type descriptor in lowering. It changes three aspects:
1. The symbol name suffix of runtime type info for PDT instantiation is changed from a serial number unrelated to the types to an encoding of the instantiated KIND parameters. 2. New runtime type info is not created for each instantiation of PDT without KIND parameters (only length parameters). Instead, the runtime type info of the type definition is always used. It is updated to contain the component descriptions. 3. Runtime type info of PDT instantiation is now always generated in the scope where the type is defined. If several PDT type instantiation are made in different scope with the same kind parameters, they will use the same runtime type info.
Rational of the change:
In lowering, derived type descriptors are not mapped when instantiating derived type objects. They are mapped later when symbol knowledge is not available anymore. This mapping is based on the FIR representation of derived types. For PDT, the FIR type information does not allow deducing the instantiation scope, it only allows retrieving the type name, the type _definition_ scope, and the kind parameter values. Therefore, in order to be able to retrieve the derived type descriptor from a FIR type, the derived type descriptor must be generated in the definition scope and must reflect the kind parameters. This justifies the need for changes 1. and 3. above (suffix and scope change). Changes 2. comes from the fact that all runtime type info of type without kind parameters can be generated from the type definition, and that because of the suffix change, the symbol name for type definition and type instantiation are the same.
Although this change is first motivated by how lowering handles derived types, I believe it is also an improvement from a functional point of view since this change will allow reducing the number of generated runtime type info for PDTs, since redundant information (different instantiations with same kind parameters) will only be generated once.
Differential Revision: https://reviews.llvm.org/D120801
show more ...
|
|
Revision tags: llvmorg-14.0.0-rc2 |
|
| #
19d86426 |
| 11-Feb-2022 |
Peter Klausler <[email protected]> |
[flang] Catch I/O of bad derived type at compile time
Derived types with allocatable and pointer components cannot be used in I/O data transfer statements unless they have defined I/O procedures ava
[flang] Catch I/O of bad derived type at compile time
Derived types with allocatable and pointer components cannot be used in I/O data transfer statements unless they have defined I/O procedures available (as type-bound or regular generics). These cases are caught as errors by the I/O runtime library, but it would be better if they were flagged during compilation.
(Address comment in review: don't use explicit name string lengths.)
Differential Revision: https://reviews.llvm.org/D120675
show more ...
|
| #
7dd7ccd2 |
| 14-Feb-2022 |
Jean Perier <[email protected]> |
[flang] Fail at link time if derived type descriptors were not generated
Currently, code generation was creating weak symbols for derived type descriptor global it could not find in the current comp
[flang] Fail at link time if derived type descriptors were not generated
Currently, code generation was creating weak symbols for derived type descriptor global it could not find in the current compilation unit. The rational is that: - the derived type descriptors of external module derived types are generated in the compilation unit that compiled the module so that the type descriptor address is uniquely associated with the type. - some types do not have derived type descriptors: the builtin derived types used to create derived type descriptors. The runtime knows about them and does not need them to accomplish the feat of describing themselves. Hence, all unresolved derived type descriptors in codegen cannot be assumed to be resolved at link time.
However, this caused immense debugging pain when, for some reasons, derived type descriptor that should be generated were not. This caused random runtime failures instead of a much cleaner link time failure.
Improve this situation by allowing codegen to detect the builtin derived types that have no derived type descriptors and requiring the other unresolved derived type descriptor to be resolved at link time.
Also make derived type descriptor constant data since this was a TODO and makes the situation even cleaner. This requiring telling lowering which compiler created symbols can be placed in read only memory. I considered using PARAMETER, but I have mixed feeling using it since that would cause the initializer expressions of derived type descriptor to be invalid from a Fortran point of view since pointer targets cannot be parameters. I do not want to start misusing Fortran attributes, even if I think it is quite unlikely semantics would currently complain. I also do not want to rely on the fact that all object symbols with the CompilerCreated flags are currently constant data. This could easily change in the future and cause runtime bugs if lowering rely on this while the assumption is not loud and clear in semantics. Instead, add a ReadOnly symbol flag to tell lowering that a compiler generated symbol can be placed in read only memory.
Differential Revision: https://reviews.llvm.org/D119555
show more ...
|
|
Revision tags: llvmorg-14.0.0-rc1, llvmorg-15-init, llvmorg-13.0.1, llvmorg-13.0.1-rc3 |
|
| #
3726626a |
| 18-Jan-2022 |
Peter Klausler <[email protected]> |
[flang] Fix crash from USE-associated defined I/O subprograms
User-defined derived type I/O implementation subroutines and generic interfaces may be USE-associated, but the code that builds the type
[flang] Fix crash from USE-associated defined I/O subprograms
User-defined derived type I/O implementation subroutines and generic interfaces may be USE-associated, but the code that builds the type description table wasn't allowing for that possibility. Add a call to GetUltimate() to cope.
Differential Revision: https://reviews.llvm.org/D117902
show more ...
|
|
Revision tags: llvmorg-13.0.1-rc2 |
|
| #
c14cf92b |
| 18-Dec-2021 |
Peter Klausler <[email protected]> |
[flang] Implement semantics for DEC STRUCTURE/RECORD
Implements part of the legacy "DEC structures" feature from VMS Fortran. STRUCTUREs are processed as if they were derived types with SEQUENCE.
[flang] Implement semantics for DEC STRUCTURE/RECORD
Implements part of the legacy "DEC structures" feature from VMS Fortran. STRUCTUREs are processed as if they were derived types with SEQUENCE. DATA-like object entity initialization is supported as well (e.g., INTEGER FOO/666/) since it was used for default component initialization in structures. Anonymous components (named %FILL) are also supported.
These features, and UNION/MAP, were already being parsed. An omission in the collection of structure field names in the case of nested structures with entity declarations was fixed in the parser.
Structures are supported in modules, but this is mostly for testing purposes. The names of fields in structures accessed via USE association cannot appear with dot notation in client code (at least not yet). DEC structures antedate Fortran 90, so their actual use in applications should not involve modules.
This patch does not implement UNION/MAP, since that feature would impose difficulties later in lowering them to MLIR types. In the meantime, if they appear, semantics will issue a "not yet implemented" error message.
Differential Revision: https://reviews.llvm.org/D117151
show more ...
|
|
Revision tags: llvmorg-13.0.1-rc1 |
|
| #
996ef895 |
| 18-Nov-2021 |
Peter Klausler <[email protected]> |
[flang] Add -fno-automatic, refine IsSaved()
This legacy option (available in other Fortran compilers with various spellings) implies the SAVE attribute for local variables on subprograms that are n
[flang] Add -fno-automatic, refine IsSaved()
This legacy option (available in other Fortran compilers with various spellings) implies the SAVE attribute for local variables on subprograms that are not explicitly RECURSIVE. The SAVE attribute essentially implies static rather than stack storage. This was the default setting in Fortran until surprisingly recently, so explicit SAVE statements & attributes could be and often were omitted from older codes. Note that initialized objects already have an implied SAVE attribute, and objects in COMMON effectively do too, as data overlays are extinct; and since objects that are expected to survive from one invocation of a procedure to the next in static storage should probably be explicit initialized in the first place, so the use cases for this option are somewhat rare, and all of them could be handled with explicit SAVE statements or attributes.
This implicit SAVE attribute must not apply to automatic (in the Fortran sense) local objects, whose sizes cannot be known at compilation time. To get the semantics of IsSaved() right, the IsAutomatic() predicate was moved into Evaluate/tools.cpp to allow for dynamic linking of the compiler. The redundant predicate IsAutomatic() was noticed, removed, and its uses replaced.
GNU Fortran's spelling of the option (-fno-automatic) was added to the clang-based driver and used for basic sanity testing.
Differential Revision: https://reviews.llvm.org/D114209
show more ...
|
| #
78d60094 |
| 15-Nov-2021 |
Peter Klausler <[email protected]> |
[flang] Deal with negative character lengths in semantics
Fortran defines LEN(X) = 0 after CHARACTER(LEN=-1)::X so apply MAX(0, ...) to character length expressions.
Differential Revision: https://
[flang] Deal with negative character lengths in semantics
Fortran defines LEN(X) = 0 after CHARACTER(LEN=-1)::X so apply MAX(0, ...) to character length expressions.
Differential Revision: https://reviews.llvm.org/D114030
show more ...
|
| #
6965a776 |
| 13-Oct-2021 |
peter klausler <[email protected]> |
[flang] Fold LGE/LGT/LLE/LLT intrinsic functions
Fold the legacy intrinsic functions LGE, LGT, LLE, & LLT by rewriting them into character relational expressions and then folding those. Also fix fo
[flang] Fold LGE/LGT/LLE/LLT intrinsic functions
Fold the legacy intrinsic functions LGE, LGT, LLE, & LLT by rewriting them into character relational expressions and then folding those. Also fix folding of comparisons of character values of distinct lengths: the shorter value must be padded with blanks. (This fix exposed some bad test cases, which are also fixed.)
Differential Revision: https://reviews.llvm.org/D111843
show more ...
|
|
Revision tags: llvmorg-13.0.0, llvmorg-13.0.0-rc4 |
|
| #
52711fb8 |
| 21-Sep-2021 |
peter klausler <[email protected]> |
[flang] Make builtin types more easily accessible; use them
Rearrange the contents of __builtin_* module files a little and make sure that semantics implicitly USEs the module __Fortran_builtins bef
[flang] Make builtin types more easily accessible; use them
Rearrange the contents of __builtin_* module files a little and make sure that semantics implicitly USEs the module __Fortran_builtins before processing each source file. This ensures that the special derived types for TEAM_TYPE, EVENT_TYPE, LOCK_TYPE, &c. exist in the symbol table where they will be available for use in coarray intrinsic function processing.
Update IsTeamType() to exploit access to the __Fortran_builtins module rather than applying ad hoc name tests. Move it and some other utilities from Semantics/tools.* to Evaluate/tools.* to make them available to intrinsics processing.
Add/correct the intrinsic table definitions for GET_TEAM, TEAM_NUMBER, and THIS_IMAGE to exercise the built-in TEAM_TYPE as an argument and as a result.
Add/correct/extend tests accordingly.
Differential Revision: https://reviews.llvm.org/D110356
show more ...
|
|
Revision tags: llvmorg-13.0.0-rc3, llvmorg-13.0.0-rc2 |
|
| #
d60a0220 |
| 10-Aug-2021 |
peter klausler <[email protected]> |
[flang] Include default component initialization in static initializers
The combined initializers constructed from DATA statements and explicit static initialization in declarations needs to include
[flang] Include default component initialization in static initializers
The combined initializers constructed from DATA statements and explicit static initialization in declarations needs to include derived type component default initializations, overriding those default values without complaint with values from explicit DATA statement or declaration initializations when they overlap. This also has to work for objects with storage association due to EQUIVALENCE. When storage association causes default component initializations to overlap, emit errors if and only if the values differ (See Fortran 2018 subclause 19.5.3, esp. paragraph 10).
The f18 front-end has a module that analyzes and converts DATA statements into equivalent static initializers for objects. For storage-associated objects, compiler-generated objects are created that overlay the entire association and fill it with a combined initializer. This "data-to-inits" module already exists, and this patch is essentially extension and clean-up of its machinery to complete the job.
Also: emit EQUIVALENCE to module files; mark compiler-created symbols and *don't* emit those to module files; check non-static EQUIVALENCE sets for conflicting default component initializations, so lowering doesn't have to check them or emit diagnostics.
Differential Revision: https://reviews.llvm.org/D109022
show more ...
|
| #
467525bd |
| 10-Aug-2021 |
peter klausler <[email protected]> |
[flang] Fix crash in runtime-type-info.cpp
Recent work in runtime assignments failed an assertion in fir-dev while running tests (flang/test/Semantics/defined-ops.f90). This test didn't fail in llv
[flang] Fix crash in runtime-type-info.cpp
Recent work in runtime assignments failed an assertion in fir-dev while running tests (flang/test/Semantics/defined-ops.f90). This test didn't fail in llvm-project/main because only the "new" Arm driver is used now, and that only builds runtime derived type information tables when some debug dumping options are enabled.
So add a reproducing test case to another test that is run with -fdebug-dump-symbols, and fix the crash by emitting special procedure binding information only for type-bound generic ASSIGNMENT(=) bindings that are relevant to the runtime support library for use in intrinsic assignment of derived types.
Differential Revision: https://reviews.llvm.org/D107918
show more ...
|
|
Revision tags: llvmorg-13.0.0-rc1 |
|
| #
65f52904 |
| 29-Jul-2021 |
peter klausler <[email protected]> |
[flang] Implement runtime Assign()
Define an API for, and implement, runtime support for arbitrary assignment of one descriptor's data to another, with full support for (re)allocation of allocatable
[flang] Implement runtime Assign()
Define an API for, and implement, runtime support for arbitrary assignment of one descriptor's data to another, with full support for (re)allocation of allocatables with finalization when necessary, user-defined derived type assignment TBP calls, and intrinsic (default) componentwise assignment of derived type instances with allocation of automatic components. Also clean up API and implementation of finalization/destruction using knowledge gained while studying edge cases for assignment in the 2018 standard.
The look-up procedure for special procedure bindings in derived types has been optimized from O(N) to O(1) since it will probably matter more. This required some analysis in runtime derived type description table construction in semantics and some changes to the table schemata.
Executable Fortran tests have been developed; they'll be added to the test base once they can be lowered and run by f18.
Differential Revision: https://reviews.llvm.org/D107678
show more ...
|
|
Revision tags: llvmorg-14-init |
|
| #
a48e4168 |
| 19-Jul-2021 |
peter klausler <[email protected]> |
[flang] Run-time derived type initialization and destruction
Use derived type information tables to drive default component initialization (when needed), component destruction, and calls to final su
[flang] Run-time derived type initialization and destruction
Use derived type information tables to drive default component initialization (when needed), component destruction, and calls to final subroutines. Perform these operations automatically for ALLOCATE()/DEALLOCATE() APIs for allocatables, automatics, and pointers. Add APIs for use in lowering to perform these operations for non-allocatable/automatic non-pointer variables. Data pointer component initialization supports arbitrary constant designators, a F'2008 feature, which may be a first for Fortran implementations.
Differential Revision: https://reviews.llvm.org/D106297
show more ...
|
|
Revision tags: llvmorg-12.0.1, llvmorg-12.0.1-rc4, llvmorg-12.0.1-rc3 |
|
| #
79caf69c |
| 17-Jun-2021 |
peter klausler <[email protected]> |
[flang] Runtime implementation for default derived type formatted I/O
This is *not* user-defined derived type I/O, but rather Fortran's built-in capabilities for using derived type data in I/O lists
[flang] Runtime implementation for default derived type formatted I/O
This is *not* user-defined derived type I/O, but rather Fortran's built-in capabilities for using derived type data in I/O lists and NAMELIST groups.
This feature depends on having the derived type description tables that are created by Semantics available, passed through compilation as initialized static objects to which pointers can be targeted in the descriptors of I/O list items and NAMELIST groups.
NAMELIST processing now handles component references on input (e.g., "&GROUP x%component = 123 /").
The C++ perspectives of the derived type information records were transformed into proper classes when it was necessary to add member functions to them.
The code in Semantics that generates derived type information was changed to emit derived type components in component order, not alphabetic order.
Differential Revision: https://reviews.llvm.org/D104485
show more ...
|
|
Revision tags: llvmorg-12.0.1-rc2 |
|
| #
1971960a |
| 04-Jun-2021 |
Jean Perier <[email protected]> |
[flang] Generate type info symbols outside of derived type scopes
A recent change was made in https://reviews.llvm.org/D101482 to cope with kind parameters. It had the side effect of generating some
[flang] Generate type info symbols outside of derived type scopes
A recent change was made in https://reviews.llvm.org/D101482 to cope with kind parameters. It had the side effect of generating some type info symbols inside derived type scopes. Derived type scope symbols are meant for components, and other/later compilation phases might choke when finding compiler generated symbols there that are not components.
This patch preserves the fix from D101482 while still generating the symbols outside of derived type scopes.
Differential Revision: https://reviews.llvm.org/D103621
show more ...
|
| #
22d7e298 |
| 02-Jun-2021 |
Peter Steinfeld <[email protected]> |
[flang] Check for duplicate definitions of defined input/output procedures
It's possible to specify defined input/output procedures either as a type-bound procedure of a derived type or as a defined
[flang] Check for duplicate definitions of defined input/output procedures
It's possible to specify defined input/output procedures either as a type-bound procedure of a derived type or as a defined-io-generic-spec. This means that you can specify the same procedure in both mechanisms, which does not cause problems. Alternatively, you can specify two different procedures to be the defined input/output procedure for the same derived type. This is an error. This change catches this error. The situation is slightly complicated by parameterized derived types. Types with the same value for a KIND parameter are treated as the same type while types with different KIND parameters are treated as different types.
I implemented this check by adding a vector to keep track of which defined input/output procedures had been seen for which derived types along with the kind of procedure (read vs write and formatted vs unformatted). I also added tests for non-parameterized types and types parameterized by KIND and LEN type parameters.
I also removed an erroneous check from the code that creates runtime type information.
Differential Revision: https://reviews.llvm.org/D103560
show more ...
|
|
Revision tags: llvmorg-12.0.1-rc1 |
|
| #
8989268d |
| 28-Apr-2021 |
Peter Steinfeld <[email protected]> |
[flang] Allow KIND type parameters to be used as LEN parameters of components
When producing the runtime type information for a component of a derived type that had a LEN type parameter, we were not
[flang] Allow KIND type parameters to be used as LEN parameters of components
When producing the runtime type information for a component of a derived type that had a LEN type parameter, we were not allowing a KIND parameter of the derived type. This was causing one of the NAG correctness tests to fail (.../hibiya/d5.f90).
I added a test to our own test suite to check for this.
Also, I fixed a typo in .../module/__fortran_type_info.f90.
I allowed KIND type parameters to be used for the declarations of components that use LEN parameters by constant folding the value of the LEN parameter. To make the constant folding work, I had to put the semantics::DerivedTypeSpec of the associated derived type into the folding context. To get this semantics::DerivedTypeSpec, I changed the value of the semantics::Scope object that was passed to DescribeComponent() to be the derived type scope rather than the containing non-derived type scope.
This scope change, in turn, caused differences in the symbol table output that is checked in typeinfo01.f90. Most of these differences were in the order that the symbols appeared in the dump. But one of them changed one of the values from "CHARACTER(2_8,1)" to "CHARACTER(1_8,1)". I'm not sure if these changes are significant. Please verify that the results of this test are still valid.
Also, I wonder if there are other situations in this code where we should be folding constants. For example, what if the field of a component has a component whose type is a PDT with a LEN type parameter, and the component's declaration depends on the KIND type parameter of the current PDT. Here's an example:
type string(stringkind) integer,kind :: stringkind character(stringkind) :: value end type string
type outer(kindparam) integer,kind :: kindparam type(string(kindparam)) :: field end type outer
I don't understand the code or what it's trying to accomplish well enough to figure out if such cases are correctly handled by my new code.
Differential Revision: https://reviews.llvm.org/D101482
show more ...
|