Skip to content

Commit 2c2ca16

Browse files
Fix C-style code generation for intrinsic function data in CALL statements (#797)
* fix: codegen.c * Fix invalid C-style code generation for intrinsic function arguments in CALL statements * fix: format codegen.c * test: add tests for CALL USING FUNCTION intrinsic arguments * fix: apply Copilot review
1 parent bd330cd commit 2c2ca16

2 files changed

Lines changed: 158 additions & 1 deletion

File tree

cobj/codegen.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,9 @@ static void joutput_data(cb_tree x) {
964964
joutput_param(x, 0);
965965
break;
966966
case CB_TAG_INTRINSIC:
967-
joutput("module.cob_procedure_parameters[%d]->data", field_iteration);
967+
joutput("CobolModule.getCurrentModule().cob_procedure_parameters.get(%d)."
968+
"getDataStorage()",
969+
field_iteration);
968970
break;
969971
case CB_TAG_CONST:
970972
if (x == cb_null) {
@@ -3031,6 +3033,7 @@ static void joutput_call(struct cb_call *p) {
30313033
joutput(" (");
30323034
for (l = p->args, n = 1; l; l = CB_CHAIN(l), n++) {
30333035
x = CB_VALUE(l);
3036+
field_iteration = (int)n - 1;
30343037
switch (CB_PURPOSE_INT(l)) {
30353038
case CB_CALL_BY_REFERENCE:
30363039
if (CB_NUMERIC_LITERAL_P(x) || CB_BINARY_OP_P(x)) {

tests/run.src/functions.at

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,3 +1898,157 @@ AT_CHECK([java prog], [0],
18981898
])
18991899

19001900
AT_CLEANUP
1901+
1902+
AT_SETUP([CALL USING FUNCTION UPPER-CASE])
1903+
1904+
AT_DATA([callee.cob], [
1905+
IDENTIFICATION DIVISION.
1906+
PROGRAM-ID. callee.
1907+
DATA DIVISION.
1908+
LINKAGE SECTION.
1909+
01 X PIC X(5).
1910+
PROCEDURE DIVISION USING X.
1911+
DISPLAY X
1912+
END-DISPLAY.
1913+
EXIT PROGRAM.
1914+
])
1915+
1916+
AT_DATA([caller.cob], [
1917+
IDENTIFICATION DIVISION.
1918+
PROGRAM-ID. caller.
1919+
DATA DIVISION.
1920+
WORKING-STORAGE SECTION.
1921+
01 X PIC X(5) VALUE "hello".
1922+
PROCEDURE DIVISION.
1923+
CALL "callee" USING FUNCTION UPPER-CASE(X)
1924+
END-CALL.
1925+
STOP RUN.
1926+
])
1927+
1928+
AT_CHECK([${COMPILE} caller.cob])
1929+
AT_CHECK([${COMPILE_MODULE} callee.cob])
1930+
AT_CHECK([java caller], [0],
1931+
[HELLO
1932+
])
1933+
1934+
AT_CLEANUP
1935+
1936+
AT_SETUP([CALL USING mixed fields and FUNCTION UPPER-CASE])
1937+
1938+
AT_DATA([callee.cob], [
1939+
IDENTIFICATION DIVISION.
1940+
PROGRAM-ID. callee.
1941+
DATA DIVISION.
1942+
LINKAGE SECTION.
1943+
01 A PIC X(5).
1944+
01 B PIC X(5).
1945+
01 C PIC X(5).
1946+
PROCEDURE DIVISION USING A B C.
1947+
DISPLAY A
1948+
END-DISPLAY.
1949+
DISPLAY B
1950+
END-DISPLAY.
1951+
DISPLAY C
1952+
END-DISPLAY.
1953+
EXIT PROGRAM.
1954+
])
1955+
1956+
AT_DATA([caller.cob], [
1957+
IDENTIFICATION DIVISION.
1958+
PROGRAM-ID. caller.
1959+
DATA DIVISION.
1960+
WORKING-STORAGE SECTION.
1961+
01 X PIC X(5) VALUE "hello".
1962+
01 Y PIC X(5) VALUE "world".
1963+
01 Z PIC X(5) VALUE "cobol".
1964+
PROCEDURE DIVISION.
1965+
CALL "callee" USING
1966+
Y
1967+
FUNCTION UPPER-CASE(X)
1968+
FUNCTION UPPER-CASE(Z)
1969+
END-CALL.
1970+
STOP RUN.
1971+
])
1972+
1973+
AT_CHECK([${COMPILE} caller.cob])
1974+
AT_CHECK([${COMPILE_MODULE} callee.cob])
1975+
AT_CHECK([java caller], [0],
1976+
[world
1977+
HELLO
1978+
COBOL
1979+
])
1980+
1981+
AT_CLEANUP
1982+
1983+
AT_SETUP([CALL USING FUNCTION LENGTH])
1984+
AT_CHECK([${SKIP_TEST}])
1985+
1986+
AT_DATA([callee.cob], [
1987+
IDENTIFICATION DIVISION.
1988+
PROGRAM-ID. callee.
1989+
DATA DIVISION.
1990+
LINKAGE SECTION.
1991+
01 LEN PIC 9(4).
1992+
PROCEDURE DIVISION USING LEN.
1993+
DISPLAY LEN
1994+
END-DISPLAY.
1995+
EXIT PROGRAM.
1996+
])
1997+
1998+
AT_DATA([caller.cob], [
1999+
IDENTIFICATION DIVISION.
2000+
PROGRAM-ID. caller.
2001+
DATA DIVISION.
2002+
WORKING-STORAGE SECTION.
2003+
01 X PIC X(5) VALUE "HELLO".
2004+
PROCEDURE DIVISION.
2005+
CALL "callee" USING FUNCTION LENGTH(X)
2006+
END-CALL.
2007+
STOP RUN.
2008+
])
2009+
2010+
AT_CHECK([${COMPILE} caller.cob])
2011+
AT_CHECK([${COMPILE_MODULE} callee.cob])
2012+
AT_CHECK([java caller], [0],
2013+
[0005
2014+
])
2015+
2016+
AT_CLEANUP
2017+
2018+
AT_SETUP([CALL USING FUNCTION MEAN])
2019+
AT_CHECK([${SKIP_TEST}])
2020+
2021+
AT_DATA([callee.cob], [
2022+
IDENTIFICATION DIVISION.
2023+
PROGRAM-ID. callee.
2024+
DATA DIVISION.
2025+
LINKAGE SECTION.
2026+
01 X PIC 9(3)V9(2).
2027+
PROCEDURE DIVISION USING X.
2028+
DISPLAY X
2029+
END-DISPLAY.
2030+
EXIT PROGRAM.
2031+
])
2032+
2033+
AT_DATA([caller.cob], [
2034+
IDENTIFICATION DIVISION.
2035+
PROGRAM-ID. caller.
2036+
DATA DIVISION.
2037+
WORKING-STORAGE SECTION.
2038+
01 WS-NUM1 PIC 9(3)V9(2) VALUE 10.50.
2039+
01 WS-NUM2 PIC 9(3)V9(2) VALUE 20.30.
2040+
01 WS-NUM3 PIC 9(3)V9(2) VALUE 30.20.
2041+
PROCEDURE DIVISION.
2042+
CALL "callee" USING
2043+
FUNCTION MEAN(WS-NUM1 WS-NUM2 WS-NUM3)
2044+
END-CALL.
2045+
STOP RUN.
2046+
])
2047+
2048+
AT_CHECK([${COMPILE} caller.cob])
2049+
AT_CHECK([${COMPILE_MODULE} callee.cob])
2050+
AT_CHECK([java caller], [0],
2051+
[020.33
2052+
])
2053+
2054+
AT_CLEANUP

0 commit comments

Comments
 (0)