[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>
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.