------- Comment #1 from pinskia at gcc dot gnu dot org 2008-12-12 23:04 ------- Why do you think __m could even appear in a static_assert? It is a function argument. Changing __m to a type of int shows the same. Changing it to a template argument causes an ICE though: t.cc: In function 'int f()': t.cc:11: internal compiler error: in tsubst_decl, at cp/pt.c:8622 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions.
--- CUT --- Testcase: #include <cassert> /// Enumeration for memory_order typedef enum memory_order { memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst } memory_order; class a { void store1(void* __v, memory_order __m = memory_order_seq_cst) volatile { assert(__m == memory_order_acquire); assert(__m == memory_order_acq_rel); assert(__m == memory_order_consume); } template<memory_order __m = memory_order_seq_cst> void store2(void* __v) { static_assert(__m == memory_order_acquire, "atomic_address::store requirements not met."); static_assert(__m == memory_order_acq_rel, "atomic_address::store requirements not met."); static_assert(__m == memory_order_consume, "atomic_address::store requirements not met."); } }; int f(void) { a b; b.store2(0); } -- pinskia at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords|rejects-valid |ice-on-valid-code http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38502