[PATCH] D84504: [flang]Verify C7107, C7108, C7109 from - Clause 7 constraint checks for f18.
sameeran joshi via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 24 03:13:09 PDT 2020
sameeranjoshi created this revision.
sameeranjoshi added reviewers: PeteSteinfeld, kiranktp, anchu-rajendran, klausler.
sameeranjoshi added a project: Flang.
Herald added a reviewer: jdoerfert.
Herald added a reviewer: DavidTruby.
1. Annotate the sources with constraint numbers.
2. Add tests for *C7107 (R765) digit shall have one of the values 0 or 1. *C7108 (R766) digit shall have one of the values 0 through 7. *C7109 (R764) A boz-literal-constant shall appear only as a data-stmt-constant in a DATA statement, or where explicitly allowed in 16.9 as an actual argument of an intrinsic procedure.
https://reviews.llvm.org/D84504
Files:
flang/lib/Semantics/expression.cpp
flang/test/Semantics/boz-literal-constants.f90
Index: flang/test/Semantics/boz-literal-constants.f90
===================================================================
--- /dev/null
+++ flang/test/Semantics/boz-literal-constants.f90
@@ -0,0 +1,79 @@
+! RUN: %S/test_errors.sh %s %t %f18
+! Confirm enforcement of constraints and restrictions in 7.7
+! C7107, C7108, C7109
+
+subroutine bozchecks
+ ! Type declaration statements
+ integer :: f, realpart = B"0101", img = B"1111", resint
+ logical :: resbit
+ complex :: rescmplx
+ real :: dbl, e
+ ! C7107
+ !ERROR: Invalid digit ('a') in BOZ literal 'b"110a"'
+ integer, parameter :: a = B"110A"
+ !ERROR: Invalid digit ('2') in BOZ literal 'b"1232"'
+ integer, parameter :: b = B"1232"
+ !ERROR: BOZ literal 'b"010101010101010101010101011111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000"' too large
+ integer, parameter :: b1 = B"010101010101010101010101011111111111111111111&
+ &111111111111111111111111111111111111111111111&
+ &111111111111111111000000000000000000000000000&
+ &000000000"
+ ! C7108
+ !ERROR: Invalid digit ('8') in BOZ literal 'o"8"'
+ integer :: c = O"8"
+ !ERROR: Invalid digit ('a') in BOZ literal 'o"a"'
+ integer :: d = O"A"
+
+ ! C7109
+ ! A) can appear only in data statement
+ ! B) Argument to intrinsics listed from 16.9 below
+ ! BGE, BGT, BLE, BLT, CMPLX, DBLE, DSHIFTL,
+ ! DSHIFTR, IAND, IEOR, INT, IOR, MERGE_BITS, REAL
+
+ ! part A
+ data f / Z"AA" / ! OK
+ ! ERROR: BOZ literal should appear in a DATA statement only as a value for an integer object, but 'rescmplx' is 'COMPLEX(4)'"
+ data rescmplx / B"010101" /
+ ! part B
+ resbit = BGE(B"0101", B"1111")
+ resbit = BGT(Z"0101", B"1111")
+ resbit = BLE(B"0101", B"1111")
+ resbit = BLT(B"0101", B"1111")
+
+ res = CMPLX (realpart, img, 4)
+ res = CMPLX (B"0101", B"1111", 4)
+
+ dbl = DBLE(B"1111")
+ dbl = DBLE(realpart)
+
+ !ERROR: Typeless (BOZ) not allowed for 'i=' argument
+ dbl = DSHIFTL(B"0101",B"0101",2)
+ !ERROR: Typeless (BOZ) not allowed for 'i=' argument
+ dbl = DSHIFTR(B"1010",B"1010",2)
+ dbl = DSHIFTL(B"0101",5,2) ! OK
+ dbl = DSHIFTR(B"1010",5,2) ! OK
+
+ !ERROR: Typeless (BOZ) not allowed for 'i=' argument
+ resint = IAND(B"0001", B"0011")
+ resint = IAND(B"0001", 3)
+
+ !ERROR: Typeless (BOZ) not allowed for 'i=' argument
+ resint = IEOR(B"0001", B"0011")
+ resint = IEOR(B"0001", 3)
+
+ resint = INT(B"1010")
+
+ !ERROR: Typeless (BOZ) not allowed for 'i=' argument
+ res = IOR(B"0101", B"0011")
+ res = IOR(B"0101", 3)
+
+ res = MERGE_BITS(13,3,11)
+ res = MERGE_BITS(B"1101",3,11)
+ !ERROR: Typeless (BOZ) not allowed for 'i=' argument
+ res = MERGE_BITS(B"1101",B"0011",11)
+ !ERROR: Typeless (BOZ) not allowed for 'i=' argument
+ res = MERGE_BITS(B"1101",B"0011",B"1011")
+ res = MERGE_BITS(B"1101",3,B"1011")
+
+ res = REAL(B"1101")
+end subroutine
Index: flang/lib/Semantics/expression.cpp
===================================================================
--- flang/lib/Semantics/expression.cpp
+++ flang/lib/Semantics/expression.cpp
@@ -633,7 +633,8 @@
++p;
auto value{BOZLiteralConstant::Read(p, base, false /*unsigned*/)};
if (*p != '"') {
- Say("Invalid digit ('%c') in BOZ literal '%s'"_err_en_US, *p, x.v);
+ Say("Invalid digit ('%c') in BOZ literal '%s'"_err_en_US, *p,
+ x.v); // C7107, C7108
return std::nullopt;
}
if (value.overflow) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84504.280380.patch
Type: text/x-patch
Size: 3539 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200724/56f100ca/attachment.bin>
More information about the llvm-commits
mailing list