Add check whether the same constant var_external variable is initialised with two (or more) different constant values.
(* Test whether the keyword XXXX may be used as an identifier for:
* variable name/identifier
*
* The XXXX names in the following code are merely a placeholder.
* They will be replaced by several identifiers before actual testing
* of the compiler.
*)
(* The identifiers that will replace the XXXX
* must be placed on a line starting with #
* All identifiers preceded by # are ignored!
* The identifier list must be placed inside an IEC 61131-3 comment.
*)
(* This file is specific for identifiers NOT identical to IL operators.
* See the note following the identifier list
*)
(*
#IL_operators #ANDN #CAL #CALC #CALCN #CD #CLK #CU #IN #JMP #JMPC #JMPCN #LD #LDN #ORN
#IL_operators #PT #PV #R #R1 #RET #RETC #RETCN #S #S1 #ST #STN #XORN
NOTE: R and S are identical to IL operators!!
#SFC_qualifiers D DS L N P #R #S SD SL
#Task_initialisers PRIORITY SINGLE INTERVAL
*)
(* NOTE: The identifier as a variable test has some special cases.
* Namely, when using IL operators as variable names.
* Even though the syntax of the IL language would not result
* in ambiguities in the above case, our parser does not currently
* allow the use of variables (with names identical to IL
* operators) within IL code.
*
* The following test code must therefore consider two possibilities:
* - if the identifier under test is an IL operator
* - if the identifier under test is not an IL operator
*)
(* A helper FUNCTION BLOCK declaration *)
function_block foo_fb
var_input
a_1, b_1: int;
end_var
var_output
c_1, d_1: int;
end_var
c_1 := 10 + b_1;
end_function_block
(* A helper FUNCTION declaration *)
function foo_f1 : int
var_input
a_1, b_1: int;
end_var
var_output
c_1, d_1: int;
end_var
c_1 := 10 + b_1;
end_function
(* Another helper FUNCTION declaration *)
function foo_f2 : int
var_input
a_1, b_1: foo_fb;
end_var
var_output
c_1, d_1: int;
end_var
c_1 := 10;
end_function
(* Another helper FUNCTION declaration *)
function bar01 : int
var_input
XXXX, a_1, b_1: int;
end_var
a_1 := 1;
end_function
(* Another helper FUNCTION_BLOCK declaration *)
function_block bar91
var
e_1, f_1 : int;
XXXX : foo_fb;
end_var
e_1 := 0;
end_function_block
(* Using XXXX as a standard variable name in IL *)
(* NOTE: Currently not supported for identifiers identical to IL operators.
* We therefore have two versions of this file, one with the following code
* commented out (used to test the identifiers that clash with IL operators)
* and a second with the following code included (used to test identifiers
* that do not clash with IL operators, such as PRIORITY, SINGLE, etc...)
*)
function_block bar92
var
e_1, f_1 : int;
XXXX : bool;
fb : foo_fb;
fb2 : bar91;
end_var
(* IL operators that - acording to the standard - are not keywords *)
LD XXXX
LDN XXXX
ANDN XXXX
ORN XXXX
XORN XXXX
R XXXX
S XXXX
ST XXXX
STN XXXX
(* IL operators that - acording to the standard - are also keywords *)
AND XXXX
OR XXXX
XOR XXXX
NOT XXXX
end_function_block
function_block bar93
var
e_1, f_1 : int;
XXXX : int;
end_var
(* IL operators that - acording to the standard - are also keywords *)
ADD XXXX
SUB XXXX
MUL XXXX
DIV XXXX
MOD XXXX
GE XXXX
GT XXXX
LE XXXX
LT XXXX
EQ XXXX
NE XXXX
(* Calling function with input parameter named XXXX *)
bar01 (
XXXX := 10
)
bar01 (
a_1 := XXXX
)
bar01 (
XXXX := XXXX
)
end_function_block
(* a helper function block *)
function_block bar94
var_input
e_1, f_1 : int;
XXXX : foo_fb;
end_var
e_1 := XXXX.c_1;
end_function_block
function_block bar95
var
e_1, f_1 : int;
XXXX : foo_fb;
fb_1 : bar93;
end_var
CAL XXXX(10)
CAL XXXX (e_1)
CAL XXXX (10, e_1, e_1, f_1)
CAL XXXX (
a_1 := 10,
b_1 := e_1,
c_1 => e_1,
d_1 => f_1
)
CAL XXXX (
a_1 := 10,
c_1 => e_1
)
CALC XXXX(10)
CALC XXXX (e_1)
CALC XXXX (10, e_1, e_1, f_1)
CALC XXXX (
a_1 := 10,
b_1 := e_1,
c_1 => e_1,
d_1 => f_1
)
CALC XXXX (
a_1 := 10,
c_1 => e_1
)
CALCN XXXX(10)
CALCN XXXX (e_1)
CALCN XXXX (10, e_1, e_1, f_1)
CALCN XXXX (
a_1 := 10,
b_1 := e_1,
c_1 => e_1,
d_1 => f_1
)
CALCN XXXX (
a_1 := 10,
c_1 => e_1
)
LD XXXX.a_1
ST XXXX.b_1
LD fb_1.XXXX
ST fb_1.XXXX
LD fb_1.XXXX.a_1
ST fb_1.XXXX.a_1
LD XXXX
foo_f2 XXXX, e_1, f_1
foo_f2 (
a_1 := XXXX,
b_1 := XXXX,
c_1 => e_1,
d_1 => f_1
)
(* Calling function with input parameter named XXXX *)
bar01 (
XXXX := 10
)
bar01 (
a_1 := XXXX.a_1
)
bar01 (
XXXX := XXXX.a_1
)
end_function_block
function_block bar96
var
e_1, f_1 : int;
XXXX : CTUD;
end_var
CU XXXX
CD XXXX
PV XXXX
end_function_block
function_block bar97
var
e_1, f_1 : int;
XXXX : R_TRIG;
end_var
CLK XXXX
end_function_block
function_block bar98
var
e_1, f_1 : int;
XXXX : TP;
end_var
IN XXXX
PT XXXX
end_function_block
function_block bar99
var
e_1, f_1 : int;
XXXX : SR;
end_var
R1 XXXX
S1 XXXX
end_function_block
(* Checking whether the use of XXXX will confuse any other
* normal and correct IL or ST code.
*)
{#include "basic_code.test" }