EDIT: oubliez, j'ai trouvé mon erreur.


Bonjour,

Voulant adapter un Bit Twiddling Hack en fonction constexpr, je suis tombé sur quelque chose qui me perturbe assez.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
static_assert(8|(8>>1)|(8>>2)|(8>>4)|(8>>8) == 15, "succes normal");
static_assert((8|(8>>1)|(8>>2)|(8>>4)|(8>>8)) == 14, "succes anormal");
static_assert(1+(8|(8>>1)|(8>>2)|(8>>4)|(8>>8)) == 16, "WTF?");
Avec GCC 4.6.3 et clang 3.5, le premier calcul me donne le bon résultat. Le second, avec la parenthèse en plus, me fait perdre 1 au résultat, et du coup, le dernier foire totalement.

Est-ce moi qui ne suit pas réveillé, ou assistons-nous à un bug de 2 compilos ?

EDIT: c'est la même chose avec les divers compilos (VC++, clang, icc, gcc) que j'ai pu essayer en ligne. Au détail qu'ils me trouvent un soucis de précédence dans les priorités de | sur la seconde ligne. Cela n'explique pas le dernier résultat, même sur-parenthésé, qui vaut tout le temps 15.