|
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 |
|
| #
be68a6ad |
| 08-Jul-2022 |
Peter Klausler <[email protected]> |
[flang] Error detection/avoidance for TRANSFER with empty MOLD= type
When MOLD= is an array and there is no SIZE= in a call to TRANSFER(), the size of an element of the MOLD= is used as the denomina
[flang] Error detection/avoidance for TRANSFER with empty MOLD= type
When MOLD= is an array and there is no SIZE= in a call to TRANSFER(), the size of an element of the MOLD= is used as the denominator in a division to establish the extent of the vector result. When the total storage size of the SOURCE= is known to be zero, the result is empty and no division is needed.
To avoid a division by zero at runtime, we need to check for a zero-sized MOLD= element type when the storage size of SOURCE= is nonzero and there is no SIZE=. Further, in the compilation-time rewriting of calls to SHAPE(TRANSFER(...)) and SIZE(TRANSFER(...)) for constant folding and simplification purposes, we can't replace the call with an arithmetic element count expression when the storage size of SOURCE= is not known to be zero and the element size of MOLD= is not known to be nonzero at compilation time.
These changes mostly affect tests using a MOLD= argument that is an assumed-length character.
Differential Revision: https://reviews.llvm.org/D129680
show more ...
|
|
Revision tags: llvmorg-14.0.6, llvmorg-14.0.5, llvmorg-14.0.4, 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 ...
|
| #
ca2be81e |
| 06-Apr-2022 |
Peter Klausler <[email protected]> |
[flang] Fix Symbol::Rank for ProcEntityDetails
When a procedure pointer or procedure dummy argument has a defined interface, the rank of the pointer (or dummy) is the rank of the interface.
Also tw
[flang] Fix Symbol::Rank for ProcEntityDetails
When a procedure pointer or procedure dummy argument has a defined interface, the rank of the pointer (or dummy) is the rank of the interface.
Also tweak code discovered in shape analysis when investigating this problam so that it returns a vector of emptied extents rather than std::nullopt when the extents are not scope-invariant, so that the rank can at least be known.
Differential Revision: https://reviews.llvm.org/D123727
show more ...
|
| #
d0549597 |
| 01-Apr-2022 |
Peter Klausler <[email protected]> |
[flang] Fix shape analysis of RESHAPE result
Shape analysis of RESHAPE(..., SHAPE=s) should of course return the SHAPE= actual argument when it is constant; but when it is not, its length is still k
[flang] Fix shape analysis of RESHAPE result
Shape analysis of RESHAPE(..., SHAPE=s) should of course return the SHAPE= actual argument when it is constant; but when it is not, its length is still known, and thus so is the rank of the result of RESHAPE(), and shape analysis should at least return a shape vector of the right length rather than a result that makes the result appear to be a scalar, which can lead to some bogus error messages.
Also, while here: rename a private GetShapeHelper::AsShape() routine so that it can't be confused with the ones in the API of shape.h.
Differential Revision: https://reviews.llvm.org/D123712
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 ...
|
| #
7f1adbab |
| 25-Mar-2022 |
Jean Perier <[email protected]> |
[flang] Fix LBOUND rewrite on descriptor components
GetLowerBoundHelper rewrite in https://reviews.llvm.org/D121488 was incorrect with POINTER/ALLOCATABLE components. The rewrite created a descripto
[flang] Fix LBOUND rewrite on descriptor components
GetLowerBoundHelper rewrite in https://reviews.llvm.org/D121488 was incorrect with POINTER/ALLOCATABLE components. The rewrite created a descriptor inquiry to the component symbol only instead of the whole named entity. The base information was lost, and not retrievable. LBOUND(a(10)%p) became LBOUND(p).
Fix this regression, and also update DescriptorInquiry unparsing to carry the kind information. DescriptorInquiries are KIND 8 expressions, while LBOUND/SIZE/RANK, %LEN are default kind expressions. This caused `print *,lbound(x,kind=8)` to unparse as `print*,lbound(x)` which is not semantically the same (this unparsing issue was not an issue for lowering, but I noticed it while writing my regression test).
Differential Revision: https://reviews.llvm.org/D122406
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 ...
|
|
Revision tags: llvmorg-14.0.0-rc2 |
|
| #
59d38f1b |
| 18-Feb-2022 |
Peter Klausler <[email protected]> |
[flang] Check constraint C711 correctly
An assumed-type actual argument that corresponds to an assumed-rank dummy argument shall be assumed-shape or assumed-rank.
Differential Revision: https://rev
[flang] Check constraint C711 correctly
An assumed-type actual argument that corresponds to an assumed-rank dummy argument shall be assumed-shape or assumed-rank.
Differential Revision: https://reviews.llvm.org/D120750
show more ...
|
|
Revision tags: llvmorg-14.0.0-rc1, llvmorg-15-init, llvmorg-13.0.1, llvmorg-13.0.1-rc3 |
|
| #
81c66933 |
| 19-Jan-2022 |
Jean Perier <[email protected]> |
[flang] Prevent any non constant result extent to be inlined on caller side
UBOUND, SIZE, and SHAPE folding was still creating expressions that are invalid on the caller side without the call expres
[flang] Prevent any non constant result extent to be inlined on caller side
UBOUND, SIZE, and SHAPE folding was still creating expressions that are invalid on the caller side without the call expression context. A previous patch intended to deal with this situation (https://reviews.llvm.org/D116933) but it assumed the return expression would be a descriptor inquiry to the result symbol, which is not the case if the extent expression is "scope invariant" inside the called subroutine (e.g., referring to intent(in) dummy arguments). Simply prevent folding from inlining non constant extent expression on the caller side.
Folding could be later improved by having ad-hoc folding for UBOUND, SIZE, and SHAPE on function references where it could try replacing the dummy symbols by the actual expression, but this is left as a possible later improvement.
Differential Revision: https://reviews.llvm.org/D117686
show more ...
|
|
Revision tags: llvmorg-13.0.1-rc2 |
|
| #
fb3faa8b |
| 10-Jan-2022 |
Jean Perier <[email protected]> |
[flang] Do not lose call in shape inquiry on function reference
Currently, something like `print *, size(foo(n,m))` was rewritten to `print *, size(foo_result_symbol)` when foo result is a non const
[flang] Do not lose call in shape inquiry on function reference
Currently, something like `print *, size(foo(n,m))` was rewritten to `print *, size(foo_result_symbol)` when foo result is a non constant shape array. This cannot be processed by lowering or reprocessed by a Fortran compiler since the syntax is wrong (`foo_result_symbol` is unknown on the caller side) and the arguments are lost when they might be required to compute the result shape.
It is not possible (and probably not desired) to make GetShape fail in general in such case since returning nullopt seems only expected for scalars or assumed rank (see GetRank usage in lib/Semantics/check-call.cpp), and returning a vector with nullopt extent may trigger some checks to believe they are facing an assumed size (like here in intrinsic argument checks: https://github.com/llvm/llvm-project/blob/196204c72c68a577c72af95d70f18e3550939a5e/flang/lib/Evaluate/intrinsics.cpp#L1530).
Hence, I went for a solution that limits the rewrite change to folding (where the original expression is returned if the shape depends on a non constant shape from a call).
I added a non default option to GetShapeHelper that prevents the rewrite of shape inquiry on calls to descriptor inquiries. At first I wanted to avoid touching GetShapeHelper, but it would require to re-implement all its logic to determine if the shape comes from a function call or not (the expression could be `size(1+foo(n,m))`). So added an alternate entry point to GetShapeHelper seemed the cleanest solution to me.
Differential Revision: https://reviews.llvm.org/D116933
show more ...
|
| #
44bc97c8 |
| 26-Nov-2021 |
Peter Klausler <[email protected]> |
[flang] Adjust names in Semantics that imply too much (NFC)
Some kinds of Fortran arrays are declared with the same syntax, and it is impossible to tell from a shape (:, :) or (*) whether the object
[flang] Adjust names in Semantics that imply too much (NFC)
Some kinds of Fortran arrays are declared with the same syntax, and it is impossible to tell from a shape (:, :) or (*) whether the object is assumed shape, deferred shape, assumed size, implied shape, or whatever without recourse to more information about the symbol in question. This patch softens the names of some predicate functions (IsAssumedShape to CanBeAssumedShape) and makes others more reflective of the syntax they represent (isAssumed to isStar) in an attempt to encourage coders to seek and find definitive predicate functions whose names deliver what they seem to mean.
Address TODO comments in IsSimplyContiguous() by using the updated IsAssumedShape() predicate.
Differential Revision: https://reviews.llvm.org/D114829
show more ...
|
|
Revision tags: llvmorg-13.0.1-rc1 |
|
| #
ca474479 |
| 01-Nov-2021 |
Peter Klausler <[email protected]> |
[flang] Don't reference non-invariant symbols in shape expressions
When an array's shape involves references to symbols that are not invariant in a scope -- the classic example being a dummy array w
[flang] Don't reference non-invariant symbols in shape expressions
When an array's shape involves references to symbols that are not invariant in a scope -- the classic example being a dummy array with an explicit shape involving other dummy arguments -- the compiler was creating shape expressions that referenced those symbols. This might be valid if those symbols are somehow captured and copied at each entry point to a subprogram, and the copies referenced in the shapes instead, but that's not the case.
This patch introduces a new expression predicate IsScopeInvariantExpr(), which defines a class of expressions that contains constant expressions (in the sense that the standard uses that term) as well as references to items that may be safely accessed in a context-free way throughout their scopes. This includes dummy arguments that are INTENT(IN) and not VALUE, descriptor inquiries into descriptors that cannot change, and bare LEN type parameters within the definitions of derived types. The new predicate is then used in shape analysis to winnow out results that would have otherwise been contextual.
Differential Revision: https://reviews.llvm.org/D113309
show more ...
|
| #
82568675 |
| 28-Sep-2021 |
Peter Klausler <[email protected]> |
[flang] Fold FINDLOC()
Fold the transformational intrinsic function FINDLOC() for all combinations of optional arguments and data types.
Differential Revision: https://reviews.llvm.org/D110757
|
|
Revision tags: llvmorg-13.0.0, llvmorg-13.0.0-rc4, llvmorg-13.0.0-rc3 |
|
| #
9245f355 |
| 13-Sep-2021 |
peter klausler <[email protected]> |
[flang] Validate SIZE(x,DIM=n) dimension for assumed-size array x
Catch invalid attempts to extract the unknowable extent of the last dimension of an assumed-size array dummy argument, and clean up
[flang] Validate SIZE(x,DIM=n) dimension for assumed-size array x
Catch invalid attempts to extract the unknowable extent of the last dimension of an assumed-size array dummy argument, and clean up problems with assumed-rank arguments in similar circumstances exposed by testing the fix.
Differential Revision: https://reviews.llvm.org/D109918
show more ...
|
| #
12ba7278 |
| 13-Sep-2021 |
peter klausler <[email protected]> |
[flang] Accept SIZE(assumed-rank, DIM=n)
Silence a bogus error message about an out-of-range DIM= argument when the argument is assumed-rank. (More generally, don't pretend to be able to discern a
[flang] Accept SIZE(assumed-rank, DIM=n)
Silence a bogus error message about an out-of-range DIM= argument when the argument is assumed-rank. (More generally, don't pretend to be able to discern a shape of known rank for an assumed-rank object.)
Differential Revision: https://reviews.llvm.org/D109915
show more ...
|
|
Revision tags: llvmorg-13.0.0-rc2 |
|
| #
3ad9826d |
| 10-Aug-2021 |
Peter Steinfeld <[email protected]> |
[flang] Fix the extent calculation when upper bounds are less than lower bounds
When the upper bound is less than the lower bound, the extent is zero. This is specified in section 8.5.8.2, paragrap
[flang] Fix the extent calculation when upper bounds are less than lower bounds
When the upper bound is less than the lower bound, the extent is zero. This is specified in section 8.5.8.2, paragraph 3.
Note that similar problems exist in the lowering code. This change only fixes the problem for the front end.
I also added a test.
Differential Revision: https://reviews.llvm.org/D107832
show more ...
|
|
Revision tags: llvmorg-13.0.0-rc1, 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 |
|
| #
1a4af2e4 |
| 17-Jun-2021 |
Jean Perier <[email protected]> |
[flang] preserve symbol in DescriptorInquiry
Do not use ultimate symbols in DescriptorInquiry. Using the ultimate symbol may lead to issues later for at least two reasons:
- The original symbols ma
[flang] preserve symbol in DescriptorInquiry
Do not use ultimate symbols in DescriptorInquiry. Using the ultimate symbol may lead to issues later for at least two reasons:
- The original symbols may have volatile/asynchronous attributes that the ultimate may not have. Later phases working on the DescriptorInquiry would then not apply potential care required by these attributes. - HostAssociatedDetails symbols are used by OpenMP for symbols with special OpenMP attributes inside OpenMP region (e.g variables with private attribute), so it is very important to preserve this aspect in the DescriptorInquiry, that would otherwise apply on the symbol outside of the region.
Differential Revision: https://reviews.llvm.org/D104385
show more ...
|
|
Revision tags: llvmorg-12.0.1-rc2 |
|
| #
47f18af5 |
| 15-Jun-2021 |
peter klausler <[email protected]> |
[flang] Fold MAXVAL & MINVAL
Implement constant folding for the reduction transformational intrinsic functions MAXVAL and MINVAL.
In anticipation of more folding work to follow, with (I hope) some
[flang] Fold MAXVAL & MINVAL
Implement constant folding for the reduction transformational intrinsic functions MAXVAL and MINVAL.
In anticipation of more folding work to follow, with (I hope) some common infrastructure, these two have been implemented in a new header file.
Differential Revision: https://reviews.llvm.org/D104337
show more ...
|
| #
dfecbcae |
| 03-Jun-2021 |
peter klausler <[email protected]> |
[flang] CheckConformance: tristate-ify result
To ensure that errors are emitted by CheckConformance and its callers in all situations, it's necessary for the returned result of that function to dist
[flang] CheckConformance: tristate-ify result
To ensure that errors are emitted by CheckConformance and its callers in all situations, it's necessary for the returned result of that function to distinguish between three possible outcomes: the arrays are known to conform at compilation time, the arrays are known to not conform (and a message has been produced), and an indeterminate result in which is not possible to determine conformance. So convert CheckConformance's result into an optional<bool>, and convert its confusing Boolean flag arguments into a bit-set of named flags too.
Differential Revision: https://reviews.llvm.org/D103654
show more ...
|
|
Revision tags: llvmorg-12.0.1-rc1, llvmorg-12.0.0, llvmorg-12.0.0-rc5, llvmorg-12.0.0-rc4, llvmorg-12.0.0-rc3, llvmorg-12.0.0-rc2, llvmorg-11.1.0, llvmorg-11.1.0-rc3 |
|
| #
efc5926c |
| 02-Feb-2021 |
peter klausler <[email protected]> |
[flang] Add TypeAndShape::MeasureElementSizeInBytes()
Split up MeasureSizeInBytes() so that array element sizes can be calculated accurately; use the new API in some places where DynamicType::Measur
[flang] Add TypeAndShape::MeasureElementSizeInBytes()
Split up MeasureSizeInBytes() so that array element sizes can be calculated accurately; use the new API in some places where DynamicType::MeasureSizeInBytes() was being used but the new API performs better due to TypeAndShape having precise CHARACTER length information.
Differential Revision: https://reviews.llvm.org/D95897
show more ...
|
| #
6f3d322f |
| 30-Jan-2021 |
peter klausler <[email protected]> |
[flang] Improve shape & length characterization
Analyze the shape of the result of TRANSFER(ptr,array) correctly when "ptr" is an array of deferred shape. Fixing this bug led to some refactoring an
[flang] Improve shape & length characterization
Analyze the shape of the result of TRANSFER(ptr,array) correctly when "ptr" is an array of deferred shape. Fixing this bug led to some refactoring and concentration of common code in TypeAndShape member functions with code in general shape and character length analysis, and this led to some regression test failures that have all been cleaned up.
Differential Revision: https://reviews.llvm.org/D95744
show more ...
|
| #
ebe74d95 |
| 29-Jan-2021 |
peter klausler <[email protected]> |
[flang] Support disabled alternative PARAMETER statement
Legacy Fortran implementations support an alternative form of the PARAMETER statement; it differs syntactically from the standard's PARAMETER
[flang] Support disabled alternative PARAMETER statement
Legacy Fortran implementations support an alternative form of the PARAMETER statement; it differs syntactically from the standard's PARAMETER statement by lacking parentheses, and semantically by using the type and shape of the initialization expression to define the attributes of the named constant. (GNU Fortran gets that part wrong; Intel Fortran and nvfortran have full support.)
This patch disables the old style PARAMETER statement by default, as it is syntactically ambiguous with conforming assignment statements; adds a new "-falternative-parameter-statement" option to enable it; and implements it correctly when enabled.
Fixes https://bugs.llvm.org/show_bug.cgi?id=48774, in which a user tripped over the syntactic ambiguity.
Differential Revision: https://reviews.llvm.org/D95697
show more ...
|