On 07/30/2013 11:27 AM, Ehsan Akhgari wrote:
> I just landed bug 895322, which removes the MOZ_STATIC_ASSERT macro in C++
> code, and replaces it with the C++11 static_assert keyword.  You should use
> static_assert in C++ code from now on.

A belated note: MOZ_STATIC_ASSERT was valid at top level, and inside method 
bodies.  C++11 static_assert is considered a declaration in the spec, so it's 
valid anywhere a declaration should go.  In particular, it's valid inside class 
bodies, and you no longer need class methods specifically to hold static 
asserts:

accessible/src/generic/Accessible.cpp
3352-Accessible::StaticAsserts() const
3353-{
3354:  static_assert(eLastChildrenFlag <= (2 << kChildrenFlagsBits) - 1,
3355-                "Accessible::mChildrenFlags was oversized by 
eLastChildrenFlag!");
3356:  static_assert(eLastStateFlag <= (2 << kStateFlagsBits) - 1,
3357-                "Accessible::mStateFlags was oversized by 
eLastStateFlag!");
3358:  static_assert(eLastAccType <= (2 << kTypeBits) - 1,
3359-                "Accessible::mType was oversized by eLastAccType!");
3360:  static_assert(eLastAccGenericType <= (2 << kGenericTypesBits) - 1,
3361-                "Accessible::mGenericType was oversized by 
eLastAccGenericType!");
3362-}

Usually it doesn't *hurt* to do it this way, except in noise.  But it *does* 
become problematic if the method's in a templated class, because the 
static_asserts only happen if the method is instantiated (i.e. if it's called):

[jwalden@find-waldo-now tmp]$ cat i.cpp 
#include <stddef.h>

template<size_t i>
struct Test
{
  void foo() { static_assert(i != 0, "fail"); }
};

int main()
{
  Test<0> t;
#if FAIL
  t.foo();
#endif
}
[jwalden@find-waldo-now tmp]$ clang++-tip -std=c++11 i.cpp 
[jwalden@find-waldo-now tmp]$ clang++-tip -std=c++11 i.cpp -DFAIL
i.cpp:6:16: error: static_assert failed "fail"
  void foo() { static_assert(i != 0, "fail"); }
               ^             ~~~~~~
i.cpp:13:5: note: in instantiation of member function 'Test<0>::foo' requested 
here
  t.foo();
    ^
1 error generated.

So to avoid this little bit of surprise, you should put your static_asserts 
inside the class you're asserting stuff about, whenever possible.

Jeff
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to