aaron.ballman added a comment.

In D155356#4513303 <https://reviews.llvm.org/D155356#4513303>, @tbaeder wrote:

> One thing I'm wondering though is:
>
>   constexpr char A[] = {'1', '2', '3'};
>   constexpr double d = __builtin_nans(A);
>
> what's expected here? The given char array is not null-terminated.

The builtin expects a null terminated string, so that should be an invalid 
constant expression due to reading off the end of the array.

> Should the interpreter ignore the null byte at the end if it's there? 
> `StringRef::getAsInteger()` always returns an error if it encounters one, so 
> the currentcode in `InterpBuiltin.cpp` ignores the last byte and will pass 
> `12` along for the example above.

Yeah, we should not do that. :-D In GCC, this builtin exists to support the 
`nans()` function from 
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n965.htm (which was proposed 
but never adopted); Clang's support is for parity with GCC.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D155356/new/

https://reviews.llvm.org/D155356

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to