Compile-time ternary operator

Hello,

I am making use of the ternary operator (?:slight_smile: in a compile-time computation. An illustrative example:

constexpr int array = {1};
constexpr int value = true ? array[0] : array[-1];

int main()
{
    return 0;
}

In the actual program, the condition determines whether it is safe to perform the access in the false-case.

Clang fails to compile this program, complaining about the out-of-bounds access in the false-case. This is the case with clang++ 3.1 on BSD and OS X.

GCC 4.7 compiles the program just fine.

Is this a bug or the intent? If it's a bug, has it been fixed in 3.2?

Thank you,
Anton

Hello,

I am making use of the ternary operator (?:slight_smile: in a compile-time computation. An illustrative example:

constexpr int array = {1};
constexpr int value = true ? array[0] : array[-1];

int main()
{
    return 0;
}

In the actual program, the condition determines whether it is safe to perform the access in the false-case.

Clang fails to compile this program, complaining about the out-of-bounds access in the false-case. This is the case with clang++ 3.1 on BSD and OS X.

Could you show the exact clang output?

GCC 4.7 compiles the program just fine.

Is this a bug or the intent? If it's a bug, has it been fixed in 3.2?

ToT Clang still warns about the out of bounds access (which could be
considered reasonable, or not - since it is unreachable - perhaps that
should be under our "analysis based warnings" that don't fire unless
the code is reachable) but it doesn't fail to compile.

You're right, it's a warning - but I almost always compile with -Werror. I suppose I could disable this one diagnostic. I currently have another workaround in place.

I don't think this is a reasonable thing to warn about, however. I imagine the warning was originally inserted because of an assumption that the expressions in the true-case and false-case are, in a way, independent of the expression in the condition (before the `?`) - but there is a lot of useful code for which that won't be so.

test.cc:2:41: error: array index -1 is before the beginning of the array
      [-Werror,-Warray-bounds]
constexpr int value = true ? array[0] : array[-1];
                                        ^ ~~
test.cc:1:1: note: array 'array' declared here
constexpr int array = {1};
^
1 error generated.

http://llvm.org/bugs/show_bug.cgi?id=10030

Joerg