https://github.com/akuhlens updated https://github.com/llvm/llvm-project/pull/200037
>From 772804dd897c36658fc238b61529451d1d85f4ad Mon Sep 17 00:00:00 2001 From: Andre Kuhlenschmidt <[email protected]> Date: Wed, 27 May 2026 10:04:45 -0700 Subject: [PATCH] initial commit --- clang/include/clang/Options/FlangOptions.td | 5 ++- clang/lib/Driver/ToolChains/Flang.cpp | 4 +- flang/docs/OpenACC-extensions.md | 22 +++++---- .../include/flang/Support/Fortran-features.h | 4 +- flang/lib/Frontend/CompilerInvocation.cpp | 10 ++--- flang/lib/Semantics/resolve-directives.cpp | 13 +++--- flang/lib/Support/Fortran-features.cpp | 2 - .../acc-default-none-scalars-strict.f90 | 45 +++++++++++++++++++ .../OpenACC/acc-default-none-scalars.f90 | 22 ++++----- 9 files changed, 90 insertions(+), 37 deletions(-) create mode 100644 flang/test/Semantics/OpenACC/acc-default-none-scalars-strict.f90 diff --git a/clang/include/clang/Options/FlangOptions.td b/clang/include/clang/Options/FlangOptions.td index 41d908b3eb43e..45446977eedd1 100644 --- a/clang/include/clang/Options/FlangOptions.td +++ b/clang/include/clang/Options/FlangOptions.td @@ -190,8 +190,9 @@ defm ppc_native_vec_elem_order: BoolOptionWithoutMarshalling<"f", "ppc-native-ve PosFlag<SetTrue, [], [ClangOption], "Specifies PowerPC native vector element order (default)">, NegFlag<SetFalse, [], [ClangOption], "Specifies PowerPC non-native vector element order">>; defm unsigned : OptInFC1FFlag<"unsigned", "Enables UNSIGNED type">; -defm acc_allow_default_none_scalars : OptInFC1FFlag<"acc-allow-default-none-scalars", - "Allow scalar variables in OpenACC default(none) regions without explicit data clauses (pre-OpenACC-3.2 behavior)">; +defm openacc_default_none_scalars_strict : OptOutFC1FFlag<"openacc-default-none-scalars-strict", + "Require explicit data clauses for all variables (including scalars) under OpenACC DEFAULT(NONE) (default)", + "Allow scalars without explicit data clauses under OpenACC DEFAULT(NONE) (pre-OpenACC-3.2 behavior)">; def fno_automatic : Flag<["-"], "fno-automatic">, Group<f_Group>, HelpText<"Implies the SAVE attribute for non-automatic local objects in subprograms unless RECURSIVE">; diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 4e4f10f27b1c8..a7bb31db545ad 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -136,8 +136,8 @@ void Flang::addDebugOptions(const llvm::opt::ArgList &Args, const JobAction &JA, options::OPT_fconvert_EQ, options::OPT_fpass_plugin_EQ, options::OPT_funderscoring, options::OPT_fno_underscoring, options::OPT_funsigned, options::OPT_fno_unsigned, - options::OPT_facc_allow_default_none_scalars, - options::OPT_fno_acc_allow_default_none_scalars, + options::OPT_fopenacc_default_none_scalars_strict, + options::OPT_fno_openacc_default_none_scalars_strict, options::OPT_finstrument_functions}); llvm::codegenoptions::DebugInfoKind DebugInfoKind; diff --git a/flang/docs/OpenACC-extensions.md b/flang/docs/OpenACC-extensions.md index 52c5e5aebfee4..664db60abf290 100644 --- a/flang/docs/OpenACC-extensions.md +++ b/flang/docs/OpenACC-extensions.md @@ -44,20 +44,26 @@ These extensions require no flag. ## Extensions enabled by flag -### `-facc-allow-default-none-scalars` — pre-OpenACC-3.2 scalar behavior under `DEFAULT(NONE)` +### `-fno-openacc-default-none-scalars-strict` — pre-OpenACC-3.2 scalar behavior under `DEFAULT(NONE)` OpenACC version 3.2 (section 1.16, change 733) clarified that the `default(none)` clause applies to scalar variables. Prior to version 3.2, `default(none)` did not impose a data-clause requirement on scalar variables. -When this flag is enabled, Flang reverts to the pre-3.2 behavior: scalar -variables referenced inside a `default(none)` compute region without an -explicit data clause do not produce an error. Instead, Flang infers implicit -data attributes for those scalars via the same implicit-copy logic applied -in regions without `default(none)`. +By default, Flang enforces the OpenACC 3.2 behavior: scalar variables +referenced inside a `default(none)` compute region without an explicit data +clause produce an error. + +When `-fno-openacc-default-none-scalars-strict` is specified, Flang reverts to +the pre-3.2 behavior: scalar variables referenced inside a `default(none)` +compute region without an explicit data clause do not produce an error. +Instead, Flang infers implicit data attributes for those scalars via the same +implicit-copy logic applied in regions without `default(none)`. Array variables always require an explicit data clause under `default(none)` regardless of this flag. -When a scalar is implicitly attributed under this extension, a warning is -emitted at `-pedantic` level (or explicitly via `-Wacc-implicit-scalar`). +When a scalar is implicitly attributed under this extension no warning is +emitted by default; explicit opt-in to the non-standard behavior is treated as +acknowledgement. Use `-Wopenacc-default-none-scalars-strict` to enable +per-use warnings for audit purposes. diff --git a/flang/include/flang/Support/Fortran-features.h b/flang/include/flang/Support/Fortran-features.h index b0ebc747157a3..19263168031ac 100644 --- a/flang/include/flang/Support/Fortran-features.h +++ b/flang/include/flang/Support/Fortran-features.h @@ -60,7 +60,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines, DefaultStructConstructorNullPointer, AssumedRankIoItem, MultipleProgramUnitsOnSameLine, AllocatedForAssociated, OpenMPThreadprivateEquivalence, RelaxedCLoc, CudaPinned, - AccDefaultNoneScalars) + OpenAccDefaultNoneScalarsStrict) // Portability and suspicious usage warnings ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable, @@ -86,7 +86,7 @@ ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable, RealConstantWidening, VolatileOrAsynchronousTemporary, UnusedVariable, UsedUndefinedVariable, BadValueInDeadCode, AssumedTypeSizeDummy, MisplacedIgnoreTKR, NamelistParameter, ImpureFinalInPure, - IgnoredNoReallocateLHS, CLoc, ExperimentalOption, AccImplicitScalar) + IgnoredNoReallocateLHS, CLoc, ExperimentalOption) using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>; using UsageWarnings = EnumSet<UsageWarning, UsageWarning_enumSize>; diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index fa0a40304545e..545a7889b4b37 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -881,12 +881,12 @@ static bool parseFrontendArgs(FrontendOptions &opts, llvm::opt::ArgList &args, opts.features.Enable(Fortran::common::LanguageFeature::RelaxedCLoc); } - // -f{no-}acc-allow-default-none-scalars + // -f{no-}openacc-default-none-scalars-strict opts.features.Enable( - Fortran::common::LanguageFeature::AccDefaultNoneScalars, - args.hasFlag(clang::options::OPT_facc_allow_default_none_scalars, - clang::options::OPT_fno_acc_allow_default_none_scalars, - false)); + Fortran::common::LanguageFeature::OpenAccDefaultNoneScalarsStrict, + args.hasFlag(clang::options::OPT_fopenacc_default_none_scalars_strict, + clang::options::OPT_fno_openacc_default_none_scalars_strict, + true)); // -f{no-}xor-operator opts.features.Enable(Fortran::common::LanguageFeature::XOROperator, diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 2fa59adf7f3af..91a69303df01a 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -1828,11 +1828,14 @@ void AccAttributeVisitor::Post(const parser::Name &name) { // TODO: why didn't name resolution set the right name originally? name.symbol = found; } else if (GetContext().defaultDSA == Symbol::Flag::AccNone) { - // 2.5.14. - if (context_.IsEnabled( - common::LanguageFeature::AccDefaultNoneScalars) && - IsAccScalar(symbol)) { - context_.Warn(common::UsageWarning::AccImplicitScalar, name.source, + // 2.5.14. Pre-OpenACC-3.2 behavior: implicit scalars warn instead of + // error unless strict mode is enabled. + if (IsAccScalar(symbol) && + !context_.IsEnabled( + common::LanguageFeature::OpenAccDefaultNoneScalarsStrict)) { + context_.Warn( + common::LanguageFeature::OpenAccDefaultNoneScalarsStrict, + name.source, "Implicit attribute inferred for DEFAULT(NONE) scalar '%s'"_warn_en_US, symbol.name()); } else { diff --git a/flang/lib/Support/Fortran-features.cpp b/flang/lib/Support/Fortran-features.cpp index c656025ac04f5..4e16d6d28b7c5 100644 --- a/flang/lib/Support/Fortran-features.cpp +++ b/flang/lib/Support/Fortran-features.cpp @@ -150,8 +150,6 @@ LanguageFeatureControl::LanguageFeatureControl() { // Possibly an accidental "feature" of nvfortran. disable_.set(LanguageFeature::AssumedRankPassedToNonAssumedRank); disable_.set(LanguageFeature::Coarray); - // Pre-OpenACC-3.2 scalar behavior under DEFAULT(NONE): disabled by default. - disable_.set(LanguageFeature::AccDefaultNoneScalars); // These warnings are enabled by default, but only because they used // to be unconditional. TODO: prune this list warnLanguage_.set(LanguageFeature::ExponentMatchingKindParam); diff --git a/flang/test/Semantics/OpenACC/acc-default-none-scalars-strict.f90 b/flang/test/Semantics/OpenACC/acc-default-none-scalars-strict.f90 new file mode 100644 index 0000000000000..adb7f8b742fcc --- /dev/null +++ b/flang/test/Semantics/OpenACC/acc-default-none-scalars-strict.f90 @@ -0,0 +1,45 @@ +! RUN: %flang_fc1 -fsyntax-only -fopenacc-default-none-scalars-strict -Wopenacc-default-none-scalars-strict %s 2>&1 | FileCheck --allow-empty --check-prefix=NO-ACC %s +! RUN: not %flang_fc1 -fsyntax-only -fopenacc %s 2>&1 | FileCheck --check-prefix=STRICT %s +! RUN: not %flang_fc1 -fsyntax-only -fopenacc -fopenacc-default-none-scalars-strict %s 2>&1 | FileCheck --check-prefix=STRICT %s +! RUN: not %flang_fc1 -fsyntax-only -fopenacc -Wopenacc-default-none-scalars-strict %s 2>&1 | FileCheck --check-prefix=STRICT %s +! RUN: not %flang_fc1 -fsyntax-only -fopenacc -fopenacc-default-none-scalars-strict -Wopenacc-default-none-scalars-strict %s 2>&1 | FileCheck --check-prefix=STRICT %s +! RUN: not %flang_fc1 -fsyntax-only -fopenacc -Wno-openacc-default-none-scalars-strict %s 2>&1 | FileCheck --check-prefix=STRICT %s +! RUN: not %flang_fc1 -fsyntax-only -fopenacc -fopenacc-default-none-scalars-strict -Wno-openacc-default-none-scalars-strict %s 2>&1 | FileCheck --check-prefix=STRICT %s +! RUN: not %flang_fc1 -fsyntax-only -fopenacc -fno-openacc-default-none-scalars-strict %s 2>&1 | FileCheck --check-prefix=SILENT-LENIENT %s +! RUN: not %flang_fc1 -fsyntax-only -fopenacc -fno-openacc-default-none-scalars-strict -Wopenacc-default-none-scalars-strict %s 2>&1 | FileCheck --check-prefix=LENIENT %s +! RUN: not %flang_fc1 -fsyntax-only -fopenacc -fno-openacc-default-none-scalars-strict -Wno-openacc-default-none-scalars-strict %s 2>&1 | FileCheck --check-prefix=SILENT-LENIENT %s + +! Without -fopenacc, no OpenACC directives are processed, so no diagnostics. +! NO-ACC-NOT: DEFAULT(NONE) clause requires +! NO-ACC-NOT: Implicit attribute inferred + +! With -fopenacc (strict mode, default), all unlisted variables error. +! STRICT: error: The DEFAULT(NONE) clause requires that 's' must be listed in a data-mapping clause +! STRICT-NOT: DEFAULT(NONE) clause requires that 'se' +! STRICT: error: The DEFAULT(NONE) clause requires that 'a' must be listed in a data-mapping clause +! STRICT-NOT: DEFAULT(NONE) clause requires that 'ae' + +! With -fno-openacc-default-none-scalars-strict (lenient mode), implicit scalars are +! silent by default; -Wopenacc-default-none-scalars-strict enables per-use warnings. +! LENIENT: warning: Implicit attribute inferred for DEFAULT(NONE) scalar 's' +! LENIENT-NOT: Implicit attribute inferred for DEFAULT(NONE) scalar 'se' +! LENIENT: error: The DEFAULT(NONE) clause requires that 'a' must be listed in a data-mapping clause +! LENIENT-NOT: DEFAULT(NONE) clause requires that 'ae' + +! Lenient mode default (no explicit -W): scalar attribution is silent; array error is unaffected. +! SILENT-LENIENT-NOT: Implicit attribute inferred for DEFAULT(NONE) scalar 's' +! SILENT-LENIENT: error: The DEFAULT(NONE) clause requires that 'a' must be listed in a data-mapping clause +! SILENT-LENIENT-NOT: DEFAULT(NONE) clause requires that 'ae' + +subroutine test() + integer :: s ! implicit scalar - no explicit data clause + integer :: se ! explicit scalar - has copyin clause + integer :: a(10) ! implicit array - no explicit data clause + integer :: ae(10) ! explicit array - has copyin clause + !$acc parallel default(none) copyin(se, ae) + s = 1 + se = 1 + a(1) = 1 + ae(1) = 1 + !$acc end parallel +end subroutine diff --git a/flang/test/Semantics/OpenACC/acc-default-none-scalars.f90 b/flang/test/Semantics/OpenACC/acc-default-none-scalars.f90 index 27cb2a08b19fb..c65626a7ced27 100644 --- a/flang/test/Semantics/OpenACC/acc-default-none-scalars.f90 +++ b/flang/test/Semantics/OpenACC/acc-default-none-scalars.f90 @@ -1,14 +1,14 @@ -! RUN: %python %S/../test_errors.py %s %flang -fopenacc -facc-allow-default-none-scalars -Wacc-implicit-scalar +! RUN: %python %S/../test_errors.py %s %flang -fopenacc -fno-openacc-default-none-scalars-strict -Wopenacc-default-none-scalars-strict -! With -facc-allow-default-none-scalars, scalar variables without explicit +! With -fno-openacc-default-none-scalars-strict, scalar variables without explicit ! data clauses under DEFAULT(NONE) are allowed and get a warning -! (-Wacc-implicit-scalar) instead of an error. Arrays continue to error. +! (-Wopenacc-default-none-scalars-strict) instead of an error. Arrays continue to error. subroutine default_none_scalars() integer :: a integer :: b(10) !$acc parallel default(none) - !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'a' [-Wacc-implicit-scalar] + !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'a' [-Wopenacc-default-none-scalars-strict] a = 1 !ERROR: The DEFAULT(NONE) clause requires that 'b' must be listed in a data-mapping clause b(1) = 2 @@ -22,9 +22,9 @@ subroutine default_none_scalar_precomputed(x, n, p, q) integer :: n, i factor = p / q !$acc parallel loop default(none) present(x) - !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'n' [-Wacc-implicit-scalar] + !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'n' [-Wopenacc-default-none-scalars-strict] do i = 1, n - !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'factor' [-Wacc-implicit-scalar] + !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'factor' [-Wopenacc-default-none-scalars-strict] x(i) = x(i) * factor end do !$acc end parallel loop @@ -64,12 +64,12 @@ subroutine default_none_outer_loop_scalars(x, n, m) thresh = real(k) - real(k) / real(m) val = real(k) * 4.0 !$acc parallel loop default(none) present(x) - !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'n' [-Wacc-implicit-scalar] + !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'n' [-Wopenacc-default-none-scalars-strict] do i = 1, n - !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'thresh' [-Wacc-implicit-scalar] - !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'coef' [-Wacc-implicit-scalar] - !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'val' [-Wacc-implicit-scalar] - !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'k' [-Wacc-implicit-scalar] + !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'thresh' [-Wopenacc-default-none-scalars-strict] + !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'coef' [-Wopenacc-default-none-scalars-strict] + !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'val' [-Wopenacc-default-none-scalars-strict] + !WARNING: Implicit attribute inferred for DEFAULT(NONE) scalar 'k' [-Wopenacc-default-none-scalars-strict] if (x(i) < thresh) x(i) = x(i) + coef * val * real(k) end do !$acc end parallel loop _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
