[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>