On Wed, Aug 27, 2014 at 05:59:17PM +0000, Joseph S. Myers wrote:
> On Mon, 25 Aug 2014, Marek Polacek wrote:
>
> > PR62024 reports that we can't use __atomic_always_lock_free in
> > a static assert, as the FEs say it's not a constant expression. Yet the
> > docs say that the result of __atomic_always_lock_free is a compile time
> > constant.
> > We can fix this pretty easily. While fold folds __atomic_always_lock_free
> > to a constant, that constant is wrapped in NOP_EXPR - and static assert
> > code is unhappy.
> > I think we can just STRIP_TYPE_NOPS - we don't expect an lvalue in the
> > static assert code. This is done in both C and C++ FEs. What do you think?
> > In C, we'd still pedwarn on such code, and in C++ we'd still reject
> > non-constexpr functions that are not builtin functions.
>
> Is this NOP_EXPR (for C) the one left by c_fully_fold to carry
> TREE_NO_WARNING information?
Yes. This NOP_EXPR can naturally also carry a location.
> If so, the C front-end part of this patch is OK, but at least in principle
> this issue could affect various other places that give a
> pedwarn-if-pedantic for something that's not an integer constant
> expression but folds to one.
Exactly. In this particular patch I've tried to limit this to
_Static_assert only.
Thanks,
Marek