Menu

#3103 invalid "error 33: Attempt to assign value to a constant variable"

closed-works-for-me
error 33 (1)
other
5
2023-01-26
2020-08-27
A.R.f.
No

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

1 Attachments

Related

Wiki: NGI0-Entrust-SDCC

Discussion

  • Philipp Klaus Krause

    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.

     
  • A.R.f.

    A.R.f. - 2020-08-28

    The line number would be a great addition. In case of this error also the name of the constant variable would be helpful

     
  • A.R.f.

    A.R.f. - 2020-08-28

    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
  • A.R.f.

    A.R.f. - 2020-09-09

    Another case, in implementation of cyclic buffer:

    #define TX_BUF_SIZE     (1 << 4)        //it has to be a power of 2
    #define TX_BUF_MAX_IND  (TX_BUF_SIZE - 1)
    static volatile uint8_t tx_buf_start = 0;
    static volatile uint8_t tx_buf_end = 0;
    static uint8_t tx_buf[TX_BUF_SIZE];
    
    static inline uint8_t tx_buf_next(const uint8_t ind)
    {
            return (ind + 1) & TX_BUF_MAX_IND;
    }
    
    static inline uint8_t tx_buf_empty()
    {
            return tx_buf_start == tx_buf_end;
    }
    
    static inline uint8_t tx_buf_full()
    {
            return tx_buf_next(tx_buf_end) == tx_buf_start;
    }
    
    static uint8_t tx_buf_add(const uint8_t b)
    {
            if( tx_buf_full() ) { return 0; }
            tx_buf[tx_buf_end] = b;
            tx_buf_end = tx_buf_next(tx_buf_end);
            UART_CR2 |= (1 << 7);           //enable TX int
            return 1;
    }
    
    static uint8_t tx_buf_pop(uint8_t* const b)
    {
            UART_CR2 &= ~(1 << 7);          //disable TX int
            if( tx_buf_empty() ) { return 0; }
            *b = tx_buf[tx_buf_start];
            tx_buf_start = tx_buf_next(tx_buf_start);
            if( !tx_buf_empty() ) { UART_CR2 |= (1 << 7); }  //enable TX int
            return 1;
    }
    

    However, it builds fine without "const" qualifier in tx_buf_next:

    static inline uint8_t tx_buf_next(uint8_t ind)
    {
            return (ind + 1) & TX_BUF_MAX_IND;
    }
    

    $ sdcc --version
    SDCC : stm8 4.0.3 #11846 (Linux)

     
  • Philipp Klaus Krause

    The error originates in this line

    werrorfl (tree->filename, tree->lineno, E_CODE_WRITE, "=");
    

    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.

     
  • A.R.f.

    A.R.f. - 2020-12-18

    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;

     
  • Philipp Klaus Krause

    • status: open --> closed-out-of-date
    • assigned_to: Philipp Klaus Krause
     
  • Philipp Klaus Krause

    I can't reproduce this issue in current [r13827].

     

    Related

    Commit: [r13827]

  • Philipp Klaus Krause

    • status: closed-out-of-date --> closed-works-for-me
     
  • Philipp Klaus Krause

    I can't reproduce this issue in current [r13827].

     

    Related

    Commit: [r13827]


Log in to post a comment.

MongoDB Logo MongoDB