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

Reply via email to