llvm-project
3beee85e - [flang][OpenMP] Fix declare reduction accessibility in module scope (#197078)

Commit
4 days ago
[flang][OpenMP] Fix declare reduction accessibility in module scope (#197078) Fix four interacting issues with OpenMP declare reduction accessibility when reductions are declared in Fortran modules: 1. Accessibility propagation (resolve-names.cpp): Reduction symbols like `op.+` had no linkage to the corresponding `operator(+)` accessibility. `ApplyDefaultAccess()` now reverse-maps mangled names to their Fortran identifiers and inherits operator/procedure accessibility. 2. USE-associated duplicate detection (resolve-names.cpp): `FindSymbol()` searched parent scopes and found USE-associated symbols, causing false "Duplicate definition" errors. Changed to scope-local `FindInScope()` with proper `UseDetails` handling that shadows USE symbols. 3. Module file serialization (mod-file.cpp): `PutUserReduction()` never emitted accessibility, so PRIVATE was lost on module file round-trips. Now emits `private::<identifier>` when no GenericDetails symbol already carries PRIVATE (avoiding duplicates with PutGeneric output). 4. Reduction clause checking (check-omp-structure.cpp): `CheckSymbolSupportsType()` scanned all module scopes ignoring accessibility. Now skips PRIVATE reductions in the module scope scan. Also fixes a pre-existing bug in `MakeNameFromOperator()` where the CharBlock lengths for OR, EQV, and NEQV included the null terminator (6/7/8 instead of 5/6/7), causing silent mismatches in StringSwitch comparisons. Note: `CheckSymbolSupportsType` still scans all global module scopes rather than only USE-reachable ones. This pre-existing over-broad lookup is improved by the PRIVATE filter added here but a proper scope-restricted resolution is left as future work. Fixes #187415 Related: #192580 Assisted-by: Claude Opus 4.6. Co-authored-by: Matt P. Dziubinski <matt-p.dziubinski@hpe.com>
Author
Parents
Loading