C-like interpreter that actually fits and runs inside most Arduino chips: wrench

So have you ever wanted to run an interpreter on an Arduino? Me neither. Then a use-case came up in my project to do that, namely: I needed to allow end-users to upload custom scripts to control my product.

Looked around for something that fit and didn't find one, so I made one: wrench

Compiles into less than 30k on most chips, runs with 1k of RAM, bytecode images are super compact, and it's very fast. Github project is here: GitHub - jingoro2112/wrench: practical embedded script interpreter

Wrote up a website for it here: wrench embedded interpreter

switches/arrays/hash-tables and every operator you could want from c!

I am actively developing this as kind of a chew-toy now so feedback is welcome.

3 Likes

Well, that is quite amazing and clearly a huge amount of work has gone into it.
There must be many examples where a user has to configure an application and a simple table of parameters is not enough yet you don't want the end user to have to go directly into the source code of the application.
I have a couple in mind (although in reality I'll probably never get around to realising them). One of them is an extension to an existing speaking clock where the user creates the sound files of all the spoken words and an index into that file. However the workflow to drive it, selecting words and assembling sentences at the right point in the cycle is too complex to be described by parameters so, currently, the user has to create it in that application as a c++ function.
Another, on the fringes of the Arduino world, would be a simple user interface designer/generator where the tool would crush the user interface down into byte code which could be cut and pasted into the application.

Very nice :star_struck:
I have a few comments, if you don't mind. I just wrote down what I encountered.

The Github LICENSE file is the MIT license, but the word "MIT" is not in the files. It would help to understand the license without having to read the whole text.

The "wrench/examples/arduino/wrench.cpp" (and wrench.h) are the same as the "wrench/src/wrench.cpp" (and wrench.h). Isn't that a version control nightmare ?

The version is not written in the "wrench.cpp" and "wrench.h" files. How do I know which version I have in a Arduino project ? I prefer something that I can print as well.

Can you give more examples ? Blink a led, do some math, also compile on a Arduino (or ESP32). You could even create a number of Wokwi examples to show off the wrench interpreter.

I was able to blink a led, but it took some time.
My first hurdle was the compiler. When I run "make" from the command line, then I get:

g++  -MD -Wall -Werror -O3  -I. -c -o objs_linux/cc.o discrete_src/cc.cpp
discrete_src/cc.cpp: In member function ‘bool WRCompilationContext::parseSwitch(bool&, WROpcode)’:
discrete_src/cc.cpp:4941:42: error: pointer may be used after ‘void operator delete [](void*)’ [-Werror=use-after-free]
 4941 |                                 delete[] table;
      |                                          ^~~~~
discrete_src/cc.cpp:4935:50: note: call to ‘void operator delete [](void*)’ here
 4935 |                                         delete[] table;
      |                                                  ^~~~~
cc1plus: all warnings being treated as errors
make: *** [Makefile:48: objs_linux/cc.o] Fout 1

Making my way around that, I get a executable "wrench" program. However, it does not tell its version number.

[UPDATE]
It is blinking: MyFirstWrench.ino - Wokwi Arduino and ESP32 Simulator
I don't know if it would be possible to use OUTPUT and HIGH and LOW in the wrench code, those values depend on the platform.

This is so cool! Thank you so much for taking the time.

The newest gcc compiler has warnings in it that mine (9.4.0) does not. Nor does the one packed with the Arduino IDE or MSVC, Thank you for pointing that one out I'll fix it.

As for the version control, discrete_src/ is the only authoritative directory, /src/wrench.* is constructed at build time and copied up to examples/arduino to make that as painless as possible. since the Arduino IDE can't include files outside of it's root (can it?)

I will include versioning in the source files from now on, and have an update to the github very shortly

I would LOVE to but it's just me :slight_smile: I am working as fast as I can in my spare time, these are excellent suggestions and I will use them as a guide.

github updated, also looking into this really cool online simulator I'm embarrassed to say I didn't know about.

I think that OUTPUT is 1 for a Arduino Uno and 3 for a ESP32.
How can I write wrench code with "OUTPUT" and fill in that value in the sketch ? I don't understand wr_makeInt() or the line: "Can operate directly on native data/arrays".

print( "Hello World!\n" );
pinMode(5,OUTPUT);

I saw a few typing errors, but I ignored most of them, except one. Could you change 'pest' into 'best' in wrench.h ?

It looks like you want to add a constant into the VM, I don't really have a way to do that but could add it.

I would suggest that your initial approach is probably correct, adding callbacks. One of my main design goals was to make that pattern very efficient, so perhaps:

void pinMode( WRState* w, const WRValue* argv, const int argn, WRValue& retVal, void* usr )
{
	if ( argn == 2 )
	{
		if ( argv[1].asInt() == 1 )
		{
			pinMode( argv[0].asInt(), OUTPUT );
		}
		else if ( argv[1].asInt() == 0 )
		{
			pinMode( argv[0].asInt(), INPUT );
		}
	}
}

And then inside wrench you could make INPUT and OUTPUT as enums to make the code look nice, this is legal wrench code:

enum
{
	INPUT = 0,
	OUTPUT = 1,
};

pinMode( 1, OUTPUT );

You can directly access an array by creating a value and passing it to a wrench function, I admit this is poorly documented as I only just changed it, and it only handles char's because thats my use case but could easily be extended if someone needs it.

// native c code
// presumably 'out' has some code in it
WRState* w = wr_newState();
WRContext* context = wr_run( w, out ); // run the code

WRValue container;
wr_makeContainer( &container );
char someArray[10] = {  0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
char addMe = 15;
wr_addStringToContainer( &container, "name", someArray );
wr_addStringToContainer( &container, "single", &addMe );

wr_callFunction(w, context, "expectsContainer", &container, 1 );

And on the wrench side you can have something like this:

function expectsContainer( data )
{
	data.name[2] = 23; // this will place a '23' directly into someArray[2] on the c-side
	data.single[0] += 10; // adds 10 to "addMe" resulting in 25
}

A little extra code is no problem, but giving my own numbers to 'OUTPUT' is not elegant.
OUTPUT is 1 for Uno here and 3 for ESP32 here.

I don't understand the container, sorry. It seems that the interpreter is already running, and then you also call a function that is declared in wrench ?

Your solution with own values for OUTPUT works.
Not only the wrench code is the same, also the sketch is exactly the same for different platforms !
wrench on ESP32: https://wokwi.com/projects/347587575048831571
wrench on Arduino Mega (with the same sketch): https://wokwi.com/projects/347617617045881426

It crashed on a Arduino Uno, because of low SRAM.

How is 'retVal' used ?
I'm trying to make a "analogRead()", but this does not work:

retVal.i = analogRead(argv[0].asInt());

The value from analogRead() is not assigned to the return value.

eek. you are quite right! looking into this now. I know it works for lib functions but I must have broken it for regular callbacks.

Okay it's been fixed. Fixed a few other bugs and also reduced the memory footprint so it should run on an uno no poroblem. Make sure you get the latest code from https://github.com/jingoro2112/wrench

Also regenerate your bytecode! I did change the format, which should very rarely (never) happen in the future but right now no one is really using it so I can get away with it :slight_smile:

-Curt

I downloaded the newest one, version 1.71, and rebuild everything, even my existing projects at Wokwi.

Every sketch as a *.ino file has already "Arduino.h" included. You may remove that from the example(s). The #include <Arduino.h> is only required when making a library with *.cpp files.

Making the 'wrench' program causes now about 30 warnings.

My first wrench test with version 1.71 in Wokwi:

Here is my newest test: TestWrench.ino - Wokwi Arduino and ESP32 Simulator
It has two tasks, each with its own interpreter. One blinks the led, the other shows the potentiometer to the Serial Monitor.
There are enough delays, but the simulator is struggling. I don't know if the wrench interpreter is safe for a multitasking environment.

I am very strict about removing warnings from my code and I also do a full test with valgrind. I get no warning when I compile with -Wall on gcc 9.4.0 or MS Visual Studio 2019. I assume you are compiling on a newer version which one are you getting the warnings on please?

Does not run on uno? I wonder why. I reduced the memory requirements to well under 1k now.

The wrench interpreter should be completely multi-threading safe, there is no global or shared data, everything is contained inside the state.

g++ --version

g++ (Ubuntu 12.2.0-3ubuntu1) 12.2.0

Did I say about 30 warnings ?

g++  -MD -Wall -Werror -O3  -I. -c -o objs_linux/cc.o discrete_src/cc.cpp
g++  -MD -Wall -Werror -O3  -I. -c -o objs_linux/operations.o discrete_src/operations.cpp
In function ‘bool doLogicalNot_E(WRValue*)’,
    inlined from ‘bool doLogicalNot_E(WRValue*)’ at discrete_src/operations.cpp:1310:13:
discrete_src/operations.cpp:1316:47: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1316 |                 return wr_LogicalNot[ element.type ]( &element );
      |                                       ~~~~~~~~^~~~
discrete_src/operations.cpp: In function ‘bool doLogicalNot_E(WRValue*)’:
discrete_src/operations.cpp:1314:25: note: ‘element’ declared here
 1314 |                 WRValue element;
      |                         ^~~~~~~
In function ‘uint32_t doBitwiseNot_E(WRValue*)’,
    inlined from ‘uint32_t doBitwiseNot_E(WRValue*)’ at discrete_src/operations.cpp:1376:17:
discrete_src/operations.cpp:1382:47: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1382 |                 return wr_bitwiseNot[ element.type ]( &element );
      |                                       ~~~~~~~~^~~~
discrete_src/operations.cpp: In function ‘uint32_t doBitwiseNot_E(WRValue*)’:
discrete_src/operations.cpp:1380:25: note: ‘element’ declared here
 1380 |                 WRValue element;
      |                         ^~~~~~~
discrete_src/operations.cpp: In function ‘void wr_RightShiftBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:970:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  970 |                 NAME##Binary[(WR_INT<<2)+element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:968:25: note: ‘element’ declared here
  968 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:987:1: note: in expansion of macro ‘X_INT_BINARY’
  987 | X_INT_BINARY( wr_RightShift, >> );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareLT_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1053:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1053 |                 return NAME[(WR_INT<<2)|element.type](to, &element);\
      |                                                 ^~~~
discrete_src/operations.cpp:1051:25: note: ‘element’ declared here
 1051 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1085:1: note: in expansion of macro ‘X_COMPARE’
 1085 | X_COMPARE( wr_CompareLT, < );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalAND_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1053:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1053 |                 return NAME[(WR_INT<<2)|element.type](to, &element);\
      |                                                 ^~~~
discrete_src/operations.cpp:1051:25: note: ‘element’ declared here
 1051 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1086:1: note: in expansion of macro ‘X_COMPARE’
 1086 | X_COMPARE( wr_LogicalAND, && );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:887:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  887 |                 NAME##Binary[(WR_INT<<2)|element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:885:25: note: ‘element’ declared here
  885 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:917:1: note: in expansion of macro ‘X_BINARY’
  917 | X_BINARY( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:887:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  887 |                 NAME##Binary[(WR_INT<<2)|element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:885:25: note: ‘element’ declared here
  885 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:918:1: note: in expansion of macro ‘X_BINARY’
  918 | X_BINARY( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_XORBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:970:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  970 |                 NAME##Binary[(WR_INT<<2)+element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:968:25: note: ‘element’ declared here
  968 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:991:1: note: in expansion of macro ‘X_INT_BINARY’
  991 | X_INT_BINARY( wr_XOR, ^ );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ANDBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:970:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  970 |                 NAME##Binary[(WR_INT<<2)+element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:968:25: note: ‘element’ declared here
  968 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:989:1: note: in expansion of macro ‘X_INT_BINARY’
  989 | X_INT_BINARY( wr_AND, & );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareEQ_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1053:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1053 |                 return NAME[(WR_INT<<2)|element.type](to, &element);\
      |                                                 ^~~~
discrete_src/operations.cpp:1051:25: note: ‘element’ declared here
 1051 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1088:1: note: in expansion of macro ‘X_COMPARE’
 1088 | X_COMPARE( wr_CompareEQ, == );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_LeftShiftBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:970:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  970 |                 NAME##Binary[(WR_INT<<2)+element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:968:25: note: ‘element’ declared here
  968 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:986:1: note: in expansion of macro ‘X_INT_BINARY’
  986 | X_INT_BINARY( wr_LeftShift, << );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ORBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:970:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  970 |                 NAME##Binary[(WR_INT<<2)+element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:968:25: note: ‘element’ declared here
  968 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:990:1: note: in expansion of macro ‘X_INT_BINARY’
  990 | X_INT_BINARY( wr_OR, | );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ModBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:970:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  970 |                 NAME##Binary[(WR_INT<<2)+element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:968:25: note: ‘element’ declared here
  968 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:988:1: note: in expansion of macro ‘X_INT_BINARY’
  988 | X_INT_BINARY( wr_Mod, % );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareGT_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1053:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1053 |                 return NAME[(WR_INT<<2)|element.type](to, &element);\
      |                                                 ^~~~
discrete_src/operations.cpp:1051:25: note: ‘element’ declared here
 1051 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1084:1: note: in expansion of macro ‘X_COMPARE’
 1084 | X_COMPARE( wr_CompareGT, > );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalOR_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1053:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1053 |                 return NAME[(WR_INT<<2)|element.type](to, &element);\
      |                                                 ^~~~
discrete_src/operations.cpp:1051:25: note: ‘element’ declared here
 1051 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1087:1: note: in expansion of macro ‘X_COMPARE’
 1087 | X_COMPARE( wr_LogicalOR, || );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AdditionBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:887:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  887 |                 NAME##Binary[(WR_INT<<2)|element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:885:25: note: ‘element’ declared here
  885 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:916:1: note: in expansion of macro ‘X_BINARY’
  916 | X_BINARY( wr_Addition, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideBinary_I_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:887:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  887 |                 NAME##Binary[(WR_INT<<2)|element.type](to, &element, target);\
      |                                                  ^~~~
discrete_src/operations.cpp:885:25: note: ‘element’ declared here
  885 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:919:1: note: in expansion of macro ‘X_BINARY’
  919 | X_BINARY( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareLT_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1033:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1033 |                 return NAME[(element.type<<2)|WR_INT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1031:25: note: ‘element’ declared here
 1031 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1085:1: note: in expansion of macro ‘X_COMPARE’
 1085 | X_COMPARE( wr_CompareLT, < );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_RightShiftAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:707:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  707 |                 NAME##Assign[(WR_INT<<2)+element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:705:25: note: ‘element’ declared here
  705 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:728:1: note: in expansion of macro ‘X_INT_ASSIGN’
  728 | X_INT_ASSIGN( wr_RightShift, >> );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_XORAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:707:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  707 |                 NAME##Assign[(WR_INT<<2)+element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:705:25: note: ‘element’ declared here
  705 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:727:1: note: in expansion of macro ‘X_INT_ASSIGN’
  727 | X_INT_ASSIGN( wr_XOR, ^ );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareGT_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1033:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1033 |                 return NAME[(element.type<<2)|WR_INT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1031:25: note: ‘element’ declared here
 1031 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1084:1: note: in expansion of macro ‘X_COMPARE’
 1084 | X_COMPARE( wr_CompareGT, > );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalAND_F_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1063:51: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1063 |                 return NAME[(WR_FLOAT<<2)|element.type](to, &element);\
      |                                                   ^~~~
discrete_src/operations.cpp:1061:25: note: ‘element’ declared here
 1061 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1086:1: note: in expansion of macro ‘X_COMPARE’
 1086 | X_COMPARE( wr_LogicalAND, && );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:786:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  786 |                 NAME##Assign[(WR_INT<<2)|element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:784:25: note: ‘element’ declared here
  784 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:830:1: note: in expansion of macro ‘X_ASSIGN’
  830 | X_ASSIGN( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:786:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  786 |                 NAME##Assign[(WR_INT<<2)|element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:784:25: note: ‘element’ declared here
  784 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:827:1: note: in expansion of macro ‘X_ASSIGN’
  827 | X_ASSIGN( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ANDBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:950:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  950 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:948:25: note: ‘element’ declared here
  948 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:989:1: note: in expansion of macro ‘X_INT_BINARY’
  989 | X_INT_BINARY( wr_AND, & );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_RightShiftBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:950:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  950 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:948:25: note: ‘element’ declared here
  948 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:987:1: note: in expansion of macro ‘X_INT_BINARY’
  987 | X_INT_BINARY( wr_RightShift, >> );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ANDAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:707:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  707 |                 NAME##Assign[(WR_INT<<2)+element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:705:25: note: ‘element’ declared here
  705 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:726:1: note: in expansion of macro ‘X_INT_ASSIGN’
  726 | X_INT_ASSIGN( wr_AND, & );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalOR_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1033:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1033 |                 return NAME[(element.type<<2)|WR_INT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1031:25: note: ‘element’ declared here
 1031 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1087:1: note: in expansion of macro ‘X_COMPARE’
 1087 | X_COMPARE( wr_LogicalOR, || );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareEQ_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1033:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1033 |                 return NAME[(element.type<<2)|WR_INT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1031:25: note: ‘element’ declared here
 1031 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1088:1: note: in expansion of macro ‘X_COMPARE’
 1088 | X_COMPARE( wr_CompareEQ, == );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ORAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:707:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  707 |                 NAME##Assign[(WR_INT<<2)+element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:705:25: note: ‘element’ declared here
  705 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:725:1: note: in expansion of macro ‘X_INT_ASSIGN’
  725 | X_INT_ASSIGN( wr_OR, | );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalAND_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1033:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1033 |                 return NAME[(element.type<<2)|WR_INT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1031:25: note: ‘element’ declared here
 1031 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1086:1: note: in expansion of macro ‘X_COMPARE’
 1086 | X_COMPARE( wr_LogicalAND, && );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareEQ_F_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1063:51: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1063 |                 return NAME[(WR_FLOAT<<2)|element.type](to, &element);\
      |                                                   ^~~~
discrete_src/operations.cpp:1061:25: note: ‘element’ declared here
 1061 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1088:1: note: in expansion of macro ‘X_COMPARE’
 1088 | X_COMPARE( wr_CompareEQ, == );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AdditionBinary_F_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:896:52: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  896 |                 NAME##Binary[(WR_FLOAT<<2)|element.type](to, &element, target);\
      |                                                    ^~~~
discrete_src/operations.cpp:894:25: note: ‘element’ declared here
  894 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:916:1: note: in expansion of macro ‘X_BINARY’
  916 | X_BINARY( wr_Addition, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyBinary_F_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:896:52: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  896 |                 NAME##Binary[(WR_FLOAT<<2)|element.type](to, &element, target);\
      |                                                    ^~~~
discrete_src/operations.cpp:894:25: note: ‘element’ declared here
  894 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:917:1: note: in expansion of macro ‘X_BINARY’
  917 | X_BINARY( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideBinary_F_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:896:52: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  896 |                 NAME##Binary[(WR_FLOAT<<2)|element.type](to, &element, target);\
      |                                                    ^~~~
discrete_src/operations.cpp:894:25: note: ‘element’ declared here
  894 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:919:1: note: in expansion of macro ‘X_BINARY’
  919 | X_BINARY( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AddAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:786:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  786 |                 NAME##Assign[(WR_INT<<2)|element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:784:25: note: ‘element’ declared here
  784 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:828:1: note: in expansion of macro ‘X_ASSIGN’
  828 | X_ASSIGN( wr_Add, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ORBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:950:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  950 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:948:25: note: ‘element’ declared here
  948 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:990:1: note: in expansion of macro ‘X_INT_BINARY’
  990 | X_INT_BINARY( wr_OR, | );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalOR_F_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1063:51: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1063 |                 return NAME[(WR_FLOAT<<2)|element.type](to, &element);\
      |                                                   ^~~~
discrete_src/operations.cpp:1061:25: note: ‘element’ declared here
 1061 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1087:1: note: in expansion of macro ‘X_COMPARE’
 1087 | X_COMPARE( wr_LogicalOR, || );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:858:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  858 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:856:25: note: ‘element’ declared here
  856 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:918:1: note: in expansion of macro ‘X_BINARY’
  918 | X_BINARY( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:858:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  858 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:856:25: note: ‘element’ declared here
  856 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:919:1: note: in expansion of macro ‘X_BINARY’
  919 | X_BINARY( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AdditionBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:858:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  858 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:856:25: note: ‘element’ declared here
  856 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:916:1: note: in expansion of macro ‘X_BINARY’
  916 | X_BINARY( wr_Addition, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ModAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:707:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  707 |                 NAME##Assign[(WR_INT<<2)+element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:705:25: note: ‘element’ declared here
  705 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:724:1: note: in expansion of macro ‘X_INT_ASSIGN’
  724 | X_INT_ASSIGN( wr_Mod, % );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareLT_F_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1063:51: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1063 |                 return NAME[(WR_FLOAT<<2)|element.type](to, &element);\
      |                                                   ^~~~
discrete_src/operations.cpp:1061:25: note: ‘element’ declared here
 1061 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1085:1: note: in expansion of macro ‘X_COMPARE’
 1085 | X_COMPARE( wr_CompareLT, < );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:858:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  858 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:856:25: note: ‘element’ declared here
  856 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:917:1: note: in expansion of macro ‘X_BINARY’
  917 | X_BINARY( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:786:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  786 |                 NAME##Assign[(WR_INT<<2)|element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:784:25: note: ‘element’ declared here
  784 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:829:1: note: in expansion of macro ‘X_ASSIGN’
  829 | X_ASSIGN( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_XORBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:950:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  950 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:948:25: note: ‘element’ declared here
  948 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:991:1: note: in expansion of macro ‘X_INT_BINARY’
  991 | X_INT_BINARY( wr_XOR, ^ );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractBinary_F_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:896:52: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  896 |                 NAME##Binary[(WR_FLOAT<<2)|element.type](to, &element, target);\
      |                                                    ^~~~
discrete_src/operations.cpp:894:25: note: ‘element’ declared here
  894 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:918:1: note: in expansion of macro ‘X_BINARY’
  918 | X_BINARY( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_LeftShiftBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:950:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  950 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:948:25: note: ‘element’ declared here
  948 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:986:1: note: in expansion of macro ‘X_INT_BINARY’
  986 | X_INT_BINARY( wr_LeftShift, << );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ModBinary_E_I(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:950:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  950 |                 NAME##Binary[(element.type<<2)|WR_INT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:948:25: note: ‘element’ declared here
  948 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:988:1: note: in expansion of macro ‘X_INT_BINARY’
  988 | X_INT_BINARY( wr_Mod, % );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareGT_F_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1063:51: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1063 |                 return NAME[(WR_FLOAT<<2)|element.type](to, &element);\
      |                                                   ^~~~
discrete_src/operations.cpp:1061:25: note: ‘element’ declared here
 1061 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1084:1: note: in expansion of macro ‘X_COMPARE’
 1084 | X_COMPARE( wr_CompareGT, > );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_LeftShiftAssign_I_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:707:50: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  707 |                 NAME##Assign[(WR_INT<<2)+element.type](to, &element);\
      |                                                  ^~~~
discrete_src/operations.cpp:705:25: note: ‘element’ declared here
  705 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:729:1: note: in expansion of macro ‘X_INT_ASSIGN’
  729 | X_INT_ASSIGN( wr_LeftShift, << );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareGT_E_F(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1043:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1043 |                 return NAME[(element.type<<2)|WR_FLOAT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1041:25: note: ‘element’ declared here
 1041 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1084:1: note: in expansion of macro ‘X_COMPARE’
 1084 | X_COMPARE( wr_CompareGT, > );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractAssign_F_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:796:52: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  796 |                 NAME##Assign[(WR_FLOAT<<2)|element.type](to, &element);\
      |                                                    ^~~~
discrete_src/operations.cpp:794:25: note: ‘element’ declared here
  794 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:827:1: note: in expansion of macro ‘X_ASSIGN’
  827 | X_ASSIGN( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideAssign_F_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:796:52: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  796 |                 NAME##Assign[(WR_FLOAT<<2)|element.type](to, &element);\
      |                                                    ^~~~
discrete_src/operations.cpp:794:25: note: ‘element’ declared here
  794 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:830:1: note: in expansion of macro ‘X_ASSIGN’
  830 | X_ASSIGN( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractBinary_E_F(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:867:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  867 |                 NAME##Binary[(element.type<<2)|WR_FLOAT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:865:25: note: ‘element’ declared here
  865 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:918:1: note: in expansion of macro ‘X_BINARY’
  918 | X_BINARY( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareEQ_E_F(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1043:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1043 |                 return NAME[(element.type<<2)|WR_FLOAT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1041:25: note: ‘element’ declared here
 1041 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1088:1: note: in expansion of macro ‘X_COMPARE’
 1088 | X_COMPARE( wr_CompareEQ, == );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalOR_E_F(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1043:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1043 |                 return NAME[(element.type<<2)|WR_FLOAT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1041:25: note: ‘element’ declared here
 1041 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1087:1: note: in expansion of macro ‘X_COMPARE’
 1087 | X_COMPARE( wr_LogicalOR, || );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareLT_E_F(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1043:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1043 |                 return NAME[(element.type<<2)|WR_FLOAT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1041:25: note: ‘element’ declared here
 1041 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1085:1: note: in expansion of macro ‘X_COMPARE’
 1085 | X_COMPARE( wr_CompareLT, < );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AdditionBinary_E_F(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:867:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  867 |                 NAME##Binary[(element.type<<2)|WR_FLOAT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:865:25: note: ‘element’ declared here
  865 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:916:1: note: in expansion of macro ‘X_BINARY’
  916 | X_BINARY( wr_Addition, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AddAssign_F_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:796:52: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  796 |                 NAME##Assign[(WR_FLOAT<<2)|element.type](to, &element);\
      |                                                    ^~~~
discrete_src/operations.cpp:794:25: note: ‘element’ declared here
  794 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:828:1: note: in expansion of macro ‘X_ASSIGN’
  828 | X_ASSIGN( wr_Add, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalAND_E_F(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1043:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1043 |                 return NAME[(element.type<<2)|WR_FLOAT](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1041:25: note: ‘element’ declared here
 1041 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1086:1: note: in expansion of macro ‘X_COMPARE’
 1086 | X_COMPARE( wr_LogicalAND, && );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyBinary_E_F(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:867:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  867 |                 NAME##Binary[(element.type<<2)|WR_FLOAT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:865:25: note: ‘element’ declared here
  865 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:917:1: note: in expansion of macro ‘X_BINARY’
  917 | X_BINARY( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideBinary_E_F(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:867:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  867 |                 NAME##Binary[(element.type<<2)|WR_FLOAT](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:865:25: note: ‘element’ declared here
  865 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:919:1: note: in expansion of macro ‘X_BINARY’
  919 | X_BINARY( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyAssign_F_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:796:52: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  796 |                 NAME##Assign[(WR_FLOAT<<2)|element.type](to, &element);\
      |                                                    ^~~~
discrete_src/operations.cpp:794:25: note: ‘element’ declared here
  794 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:829:1: note: in expansion of macro ‘X_ASSIGN’
  829 | X_ASSIGN( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareGT_E_R(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1023:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1023 |                 return NAME[(element.type<<2)|from->type](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1021:25: note: ‘element’ declared here
 1021 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1084:1: note: in expansion of macro ‘X_COMPARE’
 1084 | X_COMPARE( wr_CompareGT, > );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ORBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:932:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  932 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:930:25: note: ‘element’ declared here
  930 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:990:1: note: in expansion of macro ‘X_INT_BINARY’
  990 | X_INT_BINARY( wr_OR, | );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalAND_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1013:51: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1013 |                 return NAME[(to->type<<2)|element.type](to, &element);\
      |                                                   ^~~~
discrete_src/operations.cpp:1011:25: note: ‘element’ declared here
 1011 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1086:1: note: in expansion of macro ‘X_COMPARE’
 1086 | X_COMPARE( wr_LogicalAND, && );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalAND_E_R(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1023:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1023 |                 return NAME[(element.type<<2)|from->type](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1021:25: note: ‘element’ declared here
 1021 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1086:1: note: in expansion of macro ‘X_COMPARE’
 1086 | X_COMPARE( wr_LogicalAND, && );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalOR_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1013:51: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1013 |                 return NAME[(to->type<<2)|element.type](to, &element);\
      |                                                   ^~~~
discrete_src/operations.cpp:1011:25: note: ‘element’ declared here
 1011 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1087:1: note: in expansion of macro ‘X_COMPARE’
 1087 | X_COMPARE( wr_LogicalOR, || );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:840:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  840 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:838:25: note: ‘element’ declared here
  838 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:917:1: note: in expansion of macro ‘X_BINARY’
  917 | X_BINARY( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_RightShiftBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:932:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  932 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:930:25: note: ‘element’ declared here
  930 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:987:1: note: in expansion of macro ‘X_INT_BINARY’
  987 | X_INT_BINARY( wr_RightShift, >> );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareGT_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1013:51: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1013 |                 return NAME[(to->type<<2)|element.type](to, &element);\
      |                                                   ^~~~
discrete_src/operations.cpp:1011:25: note: ‘element’ declared here
 1011 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1084:1: note: in expansion of macro ‘X_COMPARE’
 1084 | X_COMPARE( wr_CompareGT, > );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_XORBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:932:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  932 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:930:25: note: ‘element’ declared here
  930 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:991:1: note: in expansion of macro ‘X_INT_BINARY’
  991 | X_INT_BINARY( wr_XOR, ^ );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareLT_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1013:51: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1013 |                 return NAME[(to->type<<2)|element.type](to, &element);\
      |                                                   ^~~~
discrete_src/operations.cpp:1011:25: note: ‘element’ declared here
 1011 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1085:1: note: in expansion of macro ‘X_COMPARE’
 1085 | X_COMPARE( wr_CompareLT, < );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ANDBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:932:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  932 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:930:25: note: ‘element’ declared here
  930 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:989:1: note: in expansion of macro ‘X_INT_BINARY’
  989 | X_INT_BINARY( wr_AND, & );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ModBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:932:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  932 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:930:25: note: ‘element’ declared here
  930 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:988:1: note: in expansion of macro ‘X_INT_BINARY’
  988 | X_INT_BINARY( wr_Mod, % );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_LeftShiftBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:932:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  932 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:930:25: note: ‘element’ declared here
  930 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:986:1: note: in expansion of macro ‘X_INT_BINARY’
  986 | X_INT_BINARY( wr_LeftShift, << );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_CompareLT_E_R(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1023:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1023 |                 return NAME[(element.type<<2)|from->type](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1021:25: note: ‘element’ declared here
 1021 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1085:1: note: in expansion of macro ‘X_COMPARE’
 1085 | X_COMPARE( wr_CompareLT, < );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:840:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  840 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:838:25: note: ‘element’ declared here
  838 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:919:1: note: in expansion of macro ‘X_BINARY’
  919 | X_BINARY( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:840:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  840 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:838:25: note: ‘element’ declared here
  838 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:918:1: note: in expansion of macro ‘X_BINARY’
  918 | X_BINARY( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘bool wr_LogicalOR_E_R(WRValue*, WRValue*)’:
discrete_src/operations.cpp:1023:38: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
 1023 |                 return NAME[(element.type<<2)|from->type](&element, from);\
      |                                      ^~~~
discrete_src/operations.cpp:1021:25: note: ‘element’ declared here
 1021 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:1087:1: note: in expansion of macro ‘X_COMPARE’
 1087 | X_COMPARE( wr_LogicalOR, || );
      | ^~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AdditionBinary_E_R(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:840:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  840 |                 NAME##Binary[(element.type<<2)|from->type](&element, from, target);\
      |                                       ^~~~
discrete_src/operations.cpp:838:25: note: ‘element’ declared here
  838 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:916:1: note: in expansion of macro ‘X_BINARY’
  916 | X_BINARY( wr_Addition, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:849:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  849 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:847:25: note: ‘element’ declared here
  847 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:917:1: note: in expansion of macro ‘X_BINARY’
  917 | X_BINARY( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_LeftShiftBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:941:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  941 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:939:25: note: ‘element’ declared here
  939 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:986:1: note: in expansion of macro ‘X_INT_BINARY’
  986 | X_INT_BINARY( wr_LeftShift, << );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ModBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:941:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  941 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:939:25: note: ‘element’ declared here
  939 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:988:1: note: in expansion of macro ‘X_INT_BINARY’
  988 | X_INT_BINARY( wr_Mod, % );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ANDBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:941:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  941 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:939:25: note: ‘element’ declared here
  939 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:989:1: note: in expansion of macro ‘X_INT_BINARY’
  989 | X_INT_BINARY( wr_AND, & );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ORBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:941:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  941 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:939:25: note: ‘element’ declared here
  939 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:990:1: note: in expansion of macro ‘X_INT_BINARY’
  990 | X_INT_BINARY( wr_OR, | );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AdditionBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:849:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  849 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:847:25: note: ‘element’ declared here
  847 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:916:1: note: in expansion of macro ‘X_BINARY’
  916 | X_BINARY( wr_Addition, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_RightShiftBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:941:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  941 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:939:25: note: ‘element’ declared here
  939 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:987:1: note: in expansion of macro ‘X_INT_BINARY’
  987 | X_INT_BINARY( wr_RightShift, >> );
      | ^~~~~~~~~~~~
In function ‘void doAssign_X_E(WRValue*, WRValue*)’,
    inlined from ‘void doAssign_X_E(WRValue*, WRValue*)’ at discrete_src/operations.cpp:255:13:
discrete_src/operations.cpp:261:46: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  261 |                 wr_assign[(WR_EX<<2)+element.type](to, &element);
      |                                      ~~~~~~~~^~~~
discrete_src/operations.cpp: In function ‘void doAssign_X_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:259:25: note: ‘element’ declared here
  259 |                 WRValue element;
      |                         ^~~~~~~
discrete_src/operations.cpp: In function ‘void wr_XORBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:941:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  941 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:939:25: note: ‘element’ declared here
  939 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:991:1: note: in expansion of macro ‘X_INT_BINARY’
  991 | X_INT_BINARY( wr_XOR, ^ );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:849:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  849 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:847:25: note: ‘element’ declared here
  847 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:918:1: note: in expansion of macro ‘X_BINARY’
  918 | X_BINARY( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideBinary_R_E(WRValue*, WRValue*, WRValue*)’:
discrete_src/operations.cpp:849:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  849 |                 NAME##Binary[(to->r->type<<2)|element.type]( to->r, &element, target);\
      |                                                       ^~~~
discrete_src/operations.cpp:847:25: note: ‘element’ declared here
  847 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:919:1: note: in expansion of macro ‘X_BINARY’
  919 | X_BINARY( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_XORAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:673:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  673 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:671:25: note: ‘element’ declared here
  671 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:727:1: note: in expansion of macro ‘X_INT_ASSIGN’
  727 | X_INT_ASSIGN( wr_XOR, ^ );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_LeftShiftAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:673:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  673 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:671:25: note: ‘element’ declared here
  671 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:729:1: note: in expansion of macro ‘X_INT_ASSIGN’
  729 | X_INT_ASSIGN( wr_LeftShift, << );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ORAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:673:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  673 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:671:25: note: ‘element’ declared here
  671 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:725:1: note: in expansion of macro ‘X_INT_ASSIGN’
  725 | X_INT_ASSIGN( wr_OR, | );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AddAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:739:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  739 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:737:25: note: ‘element’ declared here
  737 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:828:1: note: in expansion of macro ‘X_ASSIGN’
  828 | X_ASSIGN( wr_Add, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:739:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  739 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:737:25: note: ‘element’ declared here
  737 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:827:1: note: in expansion of macro ‘X_ASSIGN’
  827 | X_ASSIGN( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:739:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  739 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:737:25: note: ‘element’ declared here
  737 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:829:1: note: in expansion of macro ‘X_ASSIGN’
  829 | X_ASSIGN( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ANDAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:673:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  673 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:671:25: note: ‘element’ declared here
  671 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:726:1: note: in expansion of macro ‘X_INT_ASSIGN’
  726 | X_INT_ASSIGN( wr_AND, & );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_RightShiftAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:673:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  673 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:671:25: note: ‘element’ declared here
  671 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:728:1: note: in expansion of macro ‘X_INT_ASSIGN’
  728 | X_INT_ASSIGN( wr_RightShift, >> );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:739:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  739 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:737:25: note: ‘element’ declared here
  737 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:830:1: note: in expansion of macro ‘X_ASSIGN’
  830 | X_ASSIGN( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ModAssign_R_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:673:55: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  673 |                 NAME##Assign[(to->r->type<<2)|element.type](to->r, &element);\
      |                                                       ^~~~
discrete_src/operations.cpp:671:25: note: ‘element’ declared here
  671 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:724:1: note: in expansion of macro ‘X_INT_ASSIGN’
  724 | X_INT_ASSIGN( wr_Mod, % );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ORAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:684:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  684 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:681:25: note: ‘element’ declared here
  681 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:725:1: note: in expansion of macro ‘X_INT_ASSIGN’
  725 | X_INT_ASSIGN( wr_OR, | );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ModAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:697:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  697 |                 NAME##Assign[(WR_EX<<2)+element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:694:25: note: ‘element’ declared here
  694 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:724:1: note: in expansion of macro ‘X_INT_ASSIGN’
  724 | X_INT_ASSIGN( wr_Mod, % );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_XORAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:684:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  684 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:681:25: note: ‘element’ declared here
  681 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:727:1: note: in expansion of macro ‘X_INT_ASSIGN’
  727 | X_INT_ASSIGN( wr_XOR, ^ );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ORAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:697:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  697 |                 NAME##Assign[(WR_EX<<2)+element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:694:25: note: ‘element’ declared here
  694 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:725:1: note: in expansion of macro ‘X_INT_ASSIGN’
  725 | X_INT_ASSIGN( wr_OR, | );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_RightShiftAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:684:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  684 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:681:25: note: ‘element’ declared here
  681 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:728:1: note: in expansion of macro ‘X_INT_ASSIGN’
  728 | X_INT_ASSIGN( wr_RightShift, >> );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AddAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:776:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  776 |                 NAME##Assign[(WR_EX<<2)|element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:773:25: note: ‘element’ declared here
  773 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:828:1: note: in expansion of macro ‘X_ASSIGN’
  828 | X_ASSIGN( wr_Add, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:750:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  750 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:747:25: note: ‘element’ declared here
  747 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:829:1: note: in expansion of macro ‘X_ASSIGN’
  829 | X_ASSIGN( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ModAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:684:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  684 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:681:25: note: ‘element’ declared here
  681 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:724:1: note: in expansion of macro ‘X_INT_ASSIGN’
  724 | X_INT_ASSIGN( wr_Mod, % );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:750:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  750 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:747:25: note: ‘element’ declared here
  747 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:827:1: note: in expansion of macro ‘X_ASSIGN’
  827 | X_ASSIGN( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_LeftShiftAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:697:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  697 |                 NAME##Assign[(WR_EX<<2)+element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:694:25: note: ‘element’ declared here
  694 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:729:1: note: in expansion of macro ‘X_INT_ASSIGN’
  729 | X_INT_ASSIGN( wr_LeftShift, << );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AddAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:750:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  750 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:747:25: note: ‘element’ declared here
  747 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:828:1: note: in expansion of macro ‘X_ASSIGN’
  828 | X_ASSIGN( wr_Add, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:750:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  750 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:747:25: note: ‘element’ declared here
  747 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:830:1: note: in expansion of macro ‘X_ASSIGN’
  830 | X_ASSIGN( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_LeftShiftAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:684:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  684 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:681:25: note: ‘element’ declared here
  681 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:729:1: note: in expansion of macro ‘X_INT_ASSIGN’
  729 | X_INT_ASSIGN( wr_LeftShift, << );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:776:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  776 |                 NAME##Assign[(WR_EX<<2)|element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:773:25: note: ‘element’ declared here
  773 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:830:1: note: in expansion of macro ‘X_ASSIGN’
  830 | X_ASSIGN( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_XORAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:697:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  697 |                 NAME##Assign[(WR_EX<<2)+element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:694:25: note: ‘element’ declared here
  694 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:727:1: note: in expansion of macro ‘X_INT_ASSIGN’
  727 | X_INT_ASSIGN( wr_XOR, ^ );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ANDAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:697:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  697 |                 NAME##Assign[(WR_EX<<2)+element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:694:25: note: ‘element’ declared here
  694 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:726:1: note: in expansion of macro ‘X_INT_ASSIGN’
  726 | X_INT_ASSIGN( wr_AND, & );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_ANDAssign_E_I(WRValue*, WRValue*)’:
discrete_src/operations.cpp:684:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  684 |                 NAME##Assign[(element.type<<2)|WR_INT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:681:25: note: ‘element’ declared here
  681 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:726:1: note: in expansion of macro ‘X_INT_ASSIGN’
  726 | X_INT_ASSIGN( wr_AND, & );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:776:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  776 |                 NAME##Assign[(WR_EX<<2)|element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:773:25: note: ‘element’ declared here
  773 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:829:1: note: in expansion of macro ‘X_ASSIGN’
  829 | X_ASSIGN( wr_Multiply, * );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:776:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  776 |                 NAME##Assign[(WR_EX<<2)|element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:773:25: note: ‘element’ declared here
  773 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:827:1: note: in expansion of macro ‘X_ASSIGN’
  827 | X_ASSIGN( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_RightShiftAssign_E_E(WRValue*, WRValue*)’:
discrete_src/operations.cpp:697:49: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  697 |                 NAME##Assign[(WR_EX<<2)+element.type]( to, &element );\
      |                                                 ^~~~
discrete_src/operations.cpp:694:25: note: ‘element’ declared here
  694 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:728:1: note: in expansion of macro ‘X_INT_ASSIGN’
  728 | X_INT_ASSIGN( wr_RightShift, >> );
      | ^~~~~~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_AddAssign_E_F(WRValue*, WRValue*)’:
discrete_src/operations.cpp:763:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  763 |                 NAME##Assign[(element.type<<2)|WR_FLOAT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:760:25: note: ‘element’ declared here
  760 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:828:1: note: in expansion of macro ‘X_ASSIGN’
  828 | X_ASSIGN( wr_Add, + );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_SubtractAssign_E_F(WRValue*, WRValue*)’:
discrete_src/operations.cpp:763:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  763 |                 NAME##Assign[(element.type<<2)|WR_FLOAT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:760:25: note: ‘element’ declared here
  760 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:827:1: note: in expansion of macro ‘X_ASSIGN’
  827 | X_ASSIGN( wr_Subtract, - );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_DivideAssign_E_F(WRValue*, WRValue*)’:
discrete_src/operations.cpp:763:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  763 |                 NAME##Assign[(element.type<<2)|WR_FLOAT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:760:25: note: ‘element’ declared here
  760 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:830:1: note: in expansion of macro ‘X_ASSIGN’
  830 | X_ASSIGN( wr_Divide, / );
      | ^~~~~~~~
discrete_src/operations.cpp: In function ‘void wr_MultiplyAssign_E_F(WRValue*, WRValue*)’:
discrete_src/operations.cpp:763:39: error: ‘element.WRValue::<anonymous>.WRValue::<unnamed union>::<anonymous>.WRValue::<unnamed union>::<unnamed struct>::type’ may be used uninitialized [-Werror=maybe-uninitialized]
  763 |                 NAME##Assign[(element.type<<2)|WR_FLOAT]( &element, from );\
      |                                       ^~~~
discrete_src/operations.cpp:760:25: note: ‘element’ declared here
  760 |                 WRValue element;\
      |                         ^~~~~~~
discrete_src/operations.cpp:829:1: note: in expansion of macro ‘X_ASSIGN’
  829 | X_ASSIGN( wr_Multiply, * );
      | ^~~~~~~~
cc1plus: all warnings being treated as errors
make: *** [Makefile:51: objs_linux/operations.o] Fout 1

You can try the Uno example and remove things until it works. If the complete 'Serial' library is not used, then the led can blink.

oh.. that.. yeah one small error in a header macro can explode like that.

I'm using a docker container with 12.2.0 now to compile it and see the latest warnings, all fixed now get latest :slightly_smiling_face:

Dunno about the Arduino.h include thing, is it a problem that its included?

Nah, just reduce the stack size to

#define WRENCH_DEFAULT_STACK_SIZE 20

And it works fine. of course don't try to run my 39-level deep Fibonacci test with a stack that small, but it's more than enough for most operations.

Others might think that it belongs there, so for educational purposes, a sketch should not have a #include <Arduino.h>.

It is very interesting and fun for me, but I have no real usage for it. I was expecting a reaction from other Wokwi users, but that didn't happen.
If you can think of a fancy example, then perhaps you get more attention. Perhaps some kind of terminal mode that accepts a single line of source code (or compiled code) and show what can be done within a limit for a certain maximum number of bytes.

For the Arduino Uno board: What if the binary code is stored in Flash/EEPROM/SDcard and is not copied to SRAM ? Its EEPROM is 1024 bytes.

I understand and fully appreciate tinker_curt reasoning for building the interpreter; but it surely seems like a load of work. We have all done one-off code to facilitate needs, especially when trying to simplify something on the client-side.

From my prospective, I simply cannot get a grip on the "almost" C syntax when numerous rules must be remembered to do anything advanced.

With microPython's capability and portability across so many uC (circuitPython for the Arduino users), I think C-like is not a place I wish to visit. I spent a career dropping wrenches on my feet and it hurts! In retirement, I am trying to swim in the mainstream as a hobby ... there are just so many toys and so little time to take side trips.

However, a very interesting project.

Sure but I plan to use this for other things, my day-job is a game programmer and a really super-compact-super-fast scripting language could come in handy for consoles where JIT is not allowed, wrench is enough faster than lua that I think I can pitch it.

Not sure I follow this, the whole point was that it IS C syntax. Take a c-program, remove the types, and you're pretty much there. Certainly nothing I would characterize as "numerous rules".

I'm not sure what the killer-app for wrench is, I guess I'm just hoping if it's fast enough and handy/useful enough it might be adopted by the right project, but I'm realistic enough to know that's not likely. I have to be satisfied with knowing I've build something good enough that it could be.