|
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 |
|
| #
a9782fea |
| 22-Jul-2022 |
Peter Klausler <[email protected]> |
[flang] Correct IsHostAssociated() to be true for BLOCK constructs
The predicate IsHostAssocited() was implemented in a way that would return true only for cases of host association into a module or
[flang] Correct IsHostAssociated() to be true for BLOCK constructs
The predicate IsHostAssocited() was implemented in a way that would return true only for cases of host association into a module or inner subprogram. Technically, the use of a name in a BLOCK construct that is not declared therein is considered in the Fortran standard to also be a form of host association, and this matters when doing error checking on DATA statements.
Differential Revision: https://reviews.llvm.org/D130388
show more ...
|
|
Revision tags: llvmorg-14.0.6 |
|
| #
cfd474e0 |
| 15-Jun-2022 |
Peter Klausler <[email protected]> |
[flang] Enforce C1552, no binding labels allowed for internal procedures
If BIND(C) appears on an internal procedure, it must have a null binding label, i.e. BIND(C,NAME="").
Also address conflicts
[flang] Enforce C1552, no binding labels allowed for internal procedures
If BIND(C) appears on an internal procedure, it must have a null binding label, i.e. BIND(C,NAME="").
Also address conflicts with D127725 which was merged during development.
Differential Revision: https://reviews.llvm.org/D128676
show more ...
|
| #
eb6cd7fe |
| 12-Jun-2022 |
Peter Klausler <[email protected]> |
[flang] ERROR STOP is not an image control statement
The predicate that determines image control statements needs to distinguish STOP (which is) from ERROR STOP (which isn't).
Differential Revision
[flang] ERROR STOP is not an image control statement
The predicate that determines image control statements needs to distinguish STOP (which is) from ERROR STOP (which isn't).
Differential Revision: https://reviews.llvm.org/D127796
show more ...
|
|
Revision tags: llvmorg-14.0.5 |
|
| #
0c190575 |
| 26-May-2022 |
Peter Klausler <[email protected]> |
[flang] Make generic resolution conform to 15.5.5.2 w/r/t host association
When two or more generic interfaces are available by declaration or by USE association at different scoping levels, we need
[flang] Make generic resolution conform to 15.5.5.2 w/r/t host association
When two or more generic interfaces are available by declaration or by USE association at different scoping levels, we need to search the outer generic interfaces as well as the inner ones, but only after the inner ones have failed to produce a specific procedure that matches a given set of actual arguments. This means that it is possible for a specific procedure of a generic interface of an inner scope to override a conflicting specific procedure of a generic interface of an outer scope.
Also cope with forward references to derived types when a generic interface is also in scope.
Fixes LLVM bug https://github.com/llvm/llvm-project/issues/55240 and LLVM bug https://github.com/llvm/llvm-project/issues/55300.
Differential Revision: https://reviews.llvm.org/D126587
show more ...
|
|
Revision tags: llvmorg-14.0.4 |
|
| #
48a8a3eb |
| 19-May-2022 |
Peter Klausler <[email protected]> |
[flang] Accept defined assignment with CLASS(*) RHS
A utility predicate in semantics was incorrectly determining that an INTERFACE ASSIGNMENT(=) (or other form of generic) could not have a specific
[flang] Accept defined assignment with CLASS(*) RHS
A utility predicate in semantics was incorrectly determining that an INTERFACE ASSIGNMENT(=) (or other form of generic) could not have a specific procedure with an unlimited polymorphic second argument. This led to a crash later in expression analysis. Fix, and extend tests.
Differential Revision: https://reviews.llvm.org/D126151
show more ...
|
| #
7f680b26 |
| 17-May-2022 |
Peter Klausler <[email protected]> |
[flang] Allow more forward references to ENTRY names
Forward references to ENTRY names to pass them as actual procedure arguments don't work in all cases, exposing some basic ordering problems in na
[flang] Allow more forward references to ENTRY names
Forward references to ENTRY names to pass them as actual procedure arguments don't work in all cases, exposing some basic ordering problems in name resolution for these symbols. Refactor; create all the necessary procedure symbols, and either function result or host association symbols (for subroutines), at the time that the subprogrma scope is created, so that the names exist in the scope as text "before" the ENTRY is processed in name resolution. Some processing remains in PostEntryStmt() so that we can check that an ENTRY with an explicit distinct RESULT doesn't also have declarations for the ENTRY name.
Differential Revision: https://reviews.llvm.org/D126142
show more ...
|
| #
8594b051 |
| 04-May-2022 |
Peter Klausler <[email protected]> |
[flang] Accept POINTER followed by INTERFACE
As is already supported for dummy procedures, we need to also accept declarations of procedure pointers that consist of a POINTER attribute statement fol
[flang] Accept POINTER followed by INTERFACE
As is already supported for dummy procedures, we need to also accept declarations of procedure pointers that consist of a POINTER attribute statement followed by an INTERFACE block. (The case of an INTERFACE block followed by a POINTER statement already works.)
While cleaning this case up, adjust the utility predicate IsProcedurePointer() to recognize it (namely a SubprogramDetails symbol with Attr::POINTER) and delete IsProcName(). Extend tests, and add better comments to symbol.h to document the two ways in which procedure pointers are represented.
Differential Revision: https://reviews.llvm.org/D125139
show more ...
|
| #
eef76f98 |
| 03-May-2022 |
Peter Klausler <[email protected]> |
[flang] Reverse a reversed type compatibility check
The semantic test for an intrinsic assignment to a polymorphic derived type entity from a type that is an extension of its base type was reversed,
[flang] Reverse a reversed type compatibility check
The semantic test for an intrinsic assignment to a polymorphic derived type entity from a type that is an extension of its base type was reversed, so it would allow assignments that it shouldn't and disallowed some that it should; and the test case for it incorectly assumed that the invalid semantics were correct. Fix the code and the test, and add a new test for the invalid case (LHS type is an extension of the RHS type).
Differential Revision: https://reviews.llvm.org/D125135
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 ...
|
| #
7e225423 |
| 15-Apr-2022 |
Peter Klausler <[email protected]> |
[flang] Finer control over error recovery with GetExpr()
Prior to this patch, the semantics utility GetExpr() will crash unconditionally if it encounters a typed expression in the parse tree that ha
[flang] Finer control over error recovery with GetExpr()
Prior to this patch, the semantics utility GetExpr() will crash unconditionally if it encounters a typed expression in the parse tree that has not been set by expression semantics. This is the right behavior when called from lowering, by which time it is known that the program had no fatal user errors, since it signifies a fatal internal error. However, prior to lowering, in the statement semantics checking code, a more nuanced test should be used before crashing -- specifically, we should not crash in the face of a missing typed expression when in error recovery mode.
Getting this right requires GetExpr() and its helper class to have access to the semantics context, so that it can check AnyFatalErrors() before crashing. So this patch touches nearly all of its call sites.
Differential Revision: https://reviews.llvm.org/D123873
show more ...
|
| #
625dedc3 |
| 05-Apr-2022 |
Peter Klausler <[email protected]> |
[flang] Allow modification of construct entities
Construct entities from ASSOCIATE, SELECT TYPE, and SELECT RANK are modifiable if the are associated with modifiable variables without vector subscri
[flang] Allow modification of construct entities
Construct entities from ASSOCIATE, SELECT TYPE, and SELECT RANK are modifiable if the are associated with modifiable variables without vector subscripts. Update WhyNotModifiable() to accept construct entities that are appropriate.
A need for more general error reporting from one overload of WhyNotModifiable() caused its result type to change to std::optional<parser::Message> instead of ::MessageFixedText, and this change had some consequences that rippled through call sites.
Some test results that didn't allow for modifiable construct entities needed to be updated.
Differential Revision: https://reviews.llvm.org/D123722
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 ...
|
| #
0363a164 |
| 23-Mar-2022 |
Peter Klausler <[email protected]> |
[flang] Fix bogus error from assignment to CLASS(*)
Assignment semantics was coughing up bad errors and crashes for intrinsic assignments to unlimited polymorphic entities while looking for any (imp
[flang] Fix bogus error from assignment to CLASS(*)
Assignment semantics was coughing up bad errors and crashes for intrinsic assignments to unlimited polymorphic entities while looking for any (impossible) user defined ASSIGNMENT(=) generic or intrinsic type conversion.
Differential Revision: https://reviews.llvm.org/D122440
show more ...
|
|
Revision tags: llvmorg-14.0.0, llvmorg-14.0.0-rc4, llvmorg-14.0.0-rc3, llvmorg-14.0.0-rc2 |
|
| #
39686557 |
| 18-Feb-2022 |
Peter Klausler <[email protected]> |
[flang] Accommodate module subprograms defined in the same module
The symbol table, name resolution, and semantic checks for module subprograms -- esp. for MODULE FUNCTION and MODULE SUBROUTINE, but
[flang] Accommodate module subprograms defined in the same module
The symbol table, name resolution, and semantic checks for module subprograms -- esp. for MODULE FUNCTION and MODULE SUBROUTINE, but also MODULE PROCEDURE -- essentially assumed that the subprogram would be defined in a submodule of the (sub)module containing its interface. However, it is conforming to instead declare a module subprogram in the *same* (sub)module as its interface, and we need to handle that case.
Since this case involves two symbols in the same scope with the same name, the symbol table details for subprograms have been extended with a pointer to the original module interface, rather than relying on searching in scopes.
Differential Revision: https://reviews.llvm.org/D120839
show more ...
|
| #
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 ...
|
|
Revision tags: llvmorg-14.0.0-rc1 |
|
| #
c4f67ea1 |
| 07-Feb-2022 |
Peter Klausler <[email protected]> |
[flang] Allow DATA initialization of derived types w/ allocatable components
While one cannot of course statically initialize an allocatable component of an instance of a derived type, its mere pres
[flang] Allow DATA initialization of derived types w/ allocatable components
While one cannot of course statically initialize an allocatable component of an instance of a derived type, its mere presence should not prevent DATA initialization of the other nonallocatable components. Semantics was treating the existence of an allocatable component as a case of "default initialization", which it is, but not one that should run afoul of C877. Add another Boolean argument to IsInitialized() to allow for a more nuanced test.
Differential Revision: https://reviews.llvm.org/D119449
show more ...
|
|
Revision tags: llvmorg-15-init |
|
| #
52a1346b |
| 26-Jan-2022 |
Peter Klausler <[email protected]> |
[flang] Distinguish intrinsic from non-intrinsic modules
For "USE, INTRINSIC", search only for intrinsic modules; for "USE, NON_INTRINSIC", do not recognize intrinsic modules. Allow modules of both
[flang] Distinguish intrinsic from non-intrinsic modules
For "USE, INTRINSIC", search only for intrinsic modules; for "USE, NON_INTRINSIC", do not recognize intrinsic modules. Allow modules of both kinds with the same name to be used in the same source file (but not in the same scoping unit, a constraint of the standard that is now enforced).
The symbol table's scope tree now has a single instance of a scope with a new kind, IntrinsicModules, whose children are the USE'd intrinsic modules (explicit or not). This separate "top-level" scope is a child of the single global scope and it allows both intrinsic and non-intrinsic modules of the same name to exist in the symbol table. Intrinsic modules' scopes' symbols now have the INTRINSIC attribute set.
The search path directories need to make a distinction between regular directories and the one(s) that point(s) to intrinsic modules. I allow for multiple intrinsic module directories in the second search path, although only one is needed today.
Differential Revision: https://reviews.llvm.org/D118631
show more ...
|
|
Revision tags: llvmorg-13.0.1, llvmorg-13.0.1-rc3, llvmorg-13.0.1-rc2 |
|
| #
f2dac557 |
| 10-Jan-2022 |
Peter Klausler <[email protected]> |
[flang] Intrinsic assignment of distinct but "same" derived types
Subclause 7.5.2.4 lists conditions under which two distinct derived types are to be considered the same type for purposes of argumen
[flang] Intrinsic assignment of distinct but "same" derived types
Subclause 7.5.2.4 lists conditions under which two distinct derived types are to be considered the same type for purposes of argument association, assignment, and so on. These conditions are implemented in evaluate::IsTkCompatibleWith(), but assignment semantics doesn't use it for testing for intrinsic assignment compatibility. Fix that.
Differential Revision: https://reviews.llvm.org/D117621
show more ...
|
| #
a5679615 |
| 08-Jan-2022 |
Peter Klausler <[email protected]> |
[flang] Better messages for function vs. array errors
When a scalar-valued function with no distinct RESULT is being called recursively in its own executable part, emit a better message about the er
[flang] Better messages for function vs. array errors
When a scalar-valued function with no distinct RESULT is being called recursively in its own executable part, emit a better message about the error. Clean up the code that resolves function vs. array ambiguities in expression semantics.
Update to address review comment
Differential Revision: https://reviews.llvm.org/D117577
show more ...
|
|
Revision tags: llvmorg-13.0.1-rc1 |
|
| #
1ee6f7ad |
| 18-Nov-2021 |
Peter Klausler <[email protected]> |
[flang] Rearrange prototype & code placement of IsCoarray()
A quick fix last week to the shared library build caused the predicate IsCoarray(const Symbol &) to be moved from Semantics to Evaluate.
[flang] Rearrange prototype & code placement of IsCoarray()
A quick fix last week to the shared library build caused the predicate IsCoarray(const Symbol &) to be moved from Semantics to Evaluate. This patch completes that move in a way that properly combines the existing IsCoarray() tests for expressions and other object with the test for a symbol.
Differential Revision: https://reviews.llvm.org/D114806
show more ...
|
| #
42bfd059 |
| 22-Nov-2021 |
Peter Klausler <[email protected]> |
[flang] Move IsCoarray() to fix shared library build
The predicate IsCoarray() needs to be in libFortranEvaluate so that IsSaved() can call it without breaking the shared library build.
Pushed with
[flang] Move IsCoarray() to fix shared library build
The predicate IsCoarray() needs to be in libFortranEvaluate so that IsSaved() can call it without breaking the shared library build.
Pushed without pre-commit review as I'm moving code around and the fix to the shared build is confirmed.
show more ...
|
| #
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 ...
|
|
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 ...
|