Hi,
when compiling the attached file SDCC ends up with an invalid error. GCC thinks that the code is correct.
Details below.
Best regards,
Adam
$ sdcc --version
SDCC : stm8 4.0.3 #11836 (Linux)
published under GNU General Public License (GPL)
$ sdcc main.c
-:0: error 33: Attempt to assign value to a constant variable (=)
$ ls
main.c
$ gcc main.c
$ ls
a.out main.c
I can reproduce the issue using current SDCC on my Debian GNU/Linux testing system on amd64.
The lack of a line number in the error message is also annoying.
The line number would be a great addition. In case of this error also the name of the constant variable would be helpful
Actually, "constant variable" is not the best term. :)
It should be just "constant [value]" or (if not constant) just "variable".
Last edit: A.R.f. 2020-08-28
Another case, in implementation of cyclic buffer:
However, it builds fine without "const" qualifier in tx_buf_next:
$ sdcc --version
SDCC : stm8 4.0.3 #11846 (Linux)
The error originates in this line
In SDDDast.c. Why no file name is available there, why the line number is reported as 0, why we hit the error at all, I do not know.
I think that the filename and line number are not available, because noLineno becomes nonzero. Whatever this variable means. This is probably obvious, if true.
If you change in line 108
ex->lineno = (noLineno ? 0 : lexLineno);
the "default" value to nonzero, like
ex->lineno = (noLineno ? 1 : lexLineno);
then the filename is reported correctly (line number "1" is reported then).
What may be more interesting, is that if you make an unconditional assignment:
ex->lineno = lexLineno;
then the error is reported more than once:
/tmp/main.c:37: error 33: Attempt to assign value to a constant variable (=)
/tmp/main.c:42: error 33: Attempt to assign value to a constant variable (=)
I've added some printfs to track changes of noLineno and display values used by function newAst_, and it looks like this:
$ ./bin/sdcc /tmp/main.c
noLineno = 0 lexLineno = 26 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 26 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 26 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 26 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 26 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 27 lexFilename = /tmp/main.c inInitMode = 0
0->1
noLineno = 1 lexLineno = 27 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 27 lexFilename = /tmp/main.c inInitMode = 0
1->0
noLineno = 0 lexLineno = 31 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 31 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 31 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 31 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 32 lexFilename = /tmp/main.c inInitMode = 0
0->1
noLineno = 1 lexLineno = 32 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 32 lexFilename = /tmp/main.c inInitMode = 0
1->0
noLineno = 0 lexLineno = 36 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 36 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 36 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 36 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 36 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 36 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 36 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 36 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 36 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
0->1
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 37 lexFilename = /tmp/main.c inInitMode = 0
1->0
noLineno = 0 lexLineno = 41 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 41 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 41 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 41 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 41 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 41 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 41 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
0->1
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
/tmp/main.c:37: error 33: Attempt to assign value to a constant variable (=)
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 42 lexFilename = /tmp/main.c inInitMode = 0
1->0
noLineno = 0 lexLineno = 47 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 47 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 47 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 47 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 47 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 47 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 47 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 48 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 48 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 48 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 0 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
0->1
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
/tmp/main.c:42: error 33: Attempt to assign value to a constant variable (=)
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
noLineno = 1 lexLineno = 49 lexFilename = /tmp/main.c inInitMode = 0
1->0
I wonder if this means that the assignments are repeated and if this is correct?
Line 26 is where the true assignment takes place in C code:
regs->ODR = portval;
I can't reproduce this issue in current [r13827].
Related
Commit: [r13827]
I can't reproduce this issue in current [r13827].
Related
Commit: [r13827]