------- 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

Reply via email to