[flang] NORM2(DIM=) argument can't be dynamically optional
authorPeter Klausler <pklausler@nvidia.com>
Thu, 30 Mar 2023 19:43:47 +0000 (12:43 -0700)
committerPeter Klausler <pklausler@nvidia.com>
Mon, 3 Apr 2023 16:00:22 +0000 (09:00 -0700)
The intrinsic function table entry for NORM2 treats its DIM=
argument as if it can be dynamically optional; this is wrong,
and it should be treated in the same way as DIM= is for other
transformational intrinsic functions like SUM.

Differential Revision: https://reviews.llvm.org/D147390

flang/lib/Evaluate/intrinsics.cpp
flang/test/Semantics/dim01.f90

index e82b62e..41e1e5c 100644 (file)
@@ -685,8 +685,10 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
             common::Intent::In, {ArgFlag::canBeNull}}},
         SameCharNoLen, Rank::scalar, IntrinsicClass::inquiryFunction},
     {"nint", {{"a", AnyReal}, DefaultingKIND}, KINDInt},
-    {"norm2", {{"x", SameReal, Rank::array}, OptionalDIM}, SameReal,
+    {"norm2", {{"x", SameReal, Rank::array}, RequiredDIM}, SameReal,
         Rank::dimReduced, IntrinsicClass::transformationalFunction},
+    {"norm2", {{"x", SameReal, Rank::array}, MissingDIM}, SameReal,
+        Rank::scalar, IntrinsicClass::transformationalFunction},
     {"not", {{"i", SameInt}}, SameInt},
     // NULL() is a special case handled in Probe() below
     {"num_images", {}, DefaultInt, Rank::scalar,
index 48c0291..2d56eb5 100644 (file)
@@ -18,6 +18,8 @@ module m
     integer, optional, intent(in) :: d
     !PORTABILITY: The actual argument for DIM= is optional, pointer, or allocatable, and it is assumed to be present and equal to 1 at execution time
     f1 = sum(a,dim=d)
+    !PORTABILITY: The actual argument for DIM= is optional, pointer, or allocatable, and it is assumed to be present and equal to 1 at execution time
+    f1 = norm2(a,dim=d)
   end function
   function f2(a,d)
     real, intent(in) :: a(:)
@@ -49,6 +51,8 @@ module m
     real, allocatable :: f11(:)
     !WARNING: The actual argument for DIM= is optional, pointer, or allocatable, and may not be absent during execution; parenthesize to silence this warning
     f11 = sum(a,dim=d)
+    !WARNING: The actual argument for DIM= is optional, pointer, or allocatable, and may not be absent during execution; parenthesize to silence this warning
+    f11 = norm2(a,dim=d)
   end function
   function f12(a,d)
     real, intent(in) :: a(:,:)
@@ -65,4 +69,3 @@ module m
     f13 = sum(a,dim=d)
   end function
 end module
-