[Bug c/60722] New: __builtin_choose_expr() does not allow 'CONST_EXP' using const variable

yann at droneaud dot fr gcc-bugzilla@gcc.gnu.org
Mon Mar 31 14:25:00 GMT 2014


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60722

            Bug ID: 60722
           Summary: __builtin_choose_expr() does not allow 'CONST_EXP'
                    using const variable
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: yann at droneaud dot fr

Created attachment 32498
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32498&action=edit
testcase

Hi,

I'm trying to use __builtin_choose_expr() with a test against a const variable:

#define VALUE 123

int
test(void)
{
    const int value = VALUE;
    int v1, v2;

    v1 = __builtin_choose_expr(__builtin_constant_p(VALUE),
                   (__builtin_choose_expr(VALUE >= 10,
                              2,
                              (__builtin_choose_expr(VALUE >= 0,
                                         1,
                                         0)))),
                    -1);

    v1 = __builtin_choose_expr(__builtin_constant_p(value),
                   (__builtin_choose_expr(value >= 10,
                              2,
                              (__builtin_choose_expr(value >= 0,
                                         1,
                                         0)))),
                   -1);

    return v1 - v2;
}




The first expression is considering a constant defined as a macro.
And the second expression is considering a constant variable.

With gcc 4.9.0 20140313 (experimental), I'm facing the following error:

$ /opt/gcc/bin/gcc -O2 -c test.c 
test.c: In function ‘test’:
test.c:21:11: erreur: first argument to ‘__builtin_choose_expr’ not a constant
          (__builtin_choose_expr(value >= 0,
           ^
test.c:19:9: erreur: first argument to ‘__builtin_choose_expr’ not a constant
        (__builtin_choose_expr(value >= 10,
         ^

(Note: with gcc 4.8, I'm also having the issue with _builtin_constant_p(value),
as bug #19449)


It's a pity gcc is not able to consider (value >= 0) as a constant expression
while its obvious
that 'value' is a constant variable (!).

It makes usage of __builtin_choose_expr() not applicable in my case.


More information about the Gcc-bugs mailing list