https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66963
--- Comment #5 from joseph at codesourcery dot com <joseph at codesourcery dot com> --- This is by design. __builtin_choose_expr requires an integer constant expression which must be evaluated before the type of the result can be known; __builtin_constant_p is for optimization and evaluates, much later, whether something is folded to a constant (including constant arguments to inline functions).