The basic point here is that the BUILD_ASSERT macro is a build assertion
that works in an expression.  That is exactly what the comment says:

 * Use BUILD_ASSERT_DECL as a declaration or a statement, or BUILD_ASSERT as
 * part of an expression. */

Can you write a build assertion macro that works in an expression in
C++03 (I guess that's what you mean when you say C++?) and in C++11?
That is the goal.  I am sure that it can be done.  If it should be done
without static_assert for languages that do not support static_assert,
or do not support static_assert in an expression, then that's fine with
me.

On Wed, Dec 20, 2017 at 09:34:16PM +0000, Sairam Venugopal wrote:
> Hi Ben,
> 
> That is not correct. Your suggestion would fix C++11 compilation on Linux and 
> Windows. However,
> 
> it would still break on C++ on Windows. static_assert is a keyword on Windows 
> on both C++ and C++11.
> However, this isn’t the case on Linux. It’s present only in C++11.
> 
> What is the inclination to use static_assert inside expressions on C++? Since 
> this is an edge-case, I feel that
> we should isolate this behavior instead of letting it permeate. In future, if 
> this is supported, it would be easier to fix this single nuance.
> 
> Eg: 
> Something like this:
> #define BUILD_ASSERT_IN_EXPR(EXPR) []{static_assert(EXPR, "assertion 
> failed”);}
> 
> Thanks,
> Sairam
> 
> On 12/20/17, 8:18 AM, "Ben Pfaff" <[email protected]> wrote:
> 
> >I don't know what you mean by "all existing definitions".  BUILD_ASSERT
> >has a few definitions but only one of them matters in this case:
> >
> >    #elif defined(__cplusplus) && __cplusplus >= 201103L
> >    #define BUILD_ASSERT(EXPR) static_assert(EXPR, "assertion failed")
> >
> >The post you cite implies that adding []{...} to the definition above
> >would fix the problem.  Is that correct?
> >
> >On Wed, Dec 20, 2017 at 12:45:04AM +0000, Sairam Venugopal wrote:
> >> Hi Ben,
> >> 
> >> I did consider updating the definition of BUILD_ASSERT, however, that 
> >> would involve changing all existing definitions (even non-expression 
> >> context).
> >> This issue is prevalent on both Linux and Windows when we start compiling 
> >> in C++ 11.
> >> 
> >> Associated post:
> >> https://urldefense.proofpoint.com/v2/url?u=https-3A__stackoverflow.com_questions_31311748_is-2Dthere-2Dany-2Dway-2Dto-2Dslip-2Da-2Dstatic-2Dassert-2Dinto-2Dan-2Dexpression-2Din-2Diso-2Dc11&d=DwIBAg&c=uilaK90D4TOVoH58JNXRgQ&r=Z6vowHUOjP5ysP_g372c49Nqc1vEKqHKNBkR5Q5Z7uo&m=w5lx09Yyfn1993a2Tdgq4IXnaFsMjRcYiRSRftu2nek&s=6YRaA_irydpTc7N1-EXIctKiFclTsRSrh9XFKKRbQlA&e=
> >> 
> >> The ideal fix would be to not use static_assert as an expression in C++11 
> >> mode. 
> >> Currently, we hit this issue here : 
> >> https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openvswitch_ovs_blob_master_lib_unaligned.h-23L172&d=DwIBAg&c=uilaK90D4TOVoH58JNXRgQ&r=Z6vowHUOjP5ysP_g372c49Nqc1vEKqHKNBkR5Q5Z7uo&m=w5lx09Yyfn1993a2Tdgq4IXnaFsMjRcYiRSRftu2nek&s=X99J8FVdp3jAiS3mMS4DWKMbIJgphnTA5fptRDK_BXU&e=
> >> 
> >> You can disregard this patch for the time being since we will need to fix 
> >> this on both Linux and Windows.
> >> 
> >> Thanks,
> >> Sairam
> >> 
> >> 
> >> 
> >> On 12/19/17, 3:45 PM, "Ben Pfaff" <[email protected]> wrote:
> >> 
> >> >On Tue, Dec 19, 2017 at 03:32:27PM -0800, Sairam Venugopal wrote:
> >> >> A static assert declaration may appear at block scope (as a block
> >> >> declaration) and inside a class body (as a member declaration). However,
> >> >> unlike sizeof, static_assert cannot be used as an expression and this is
> >> >> strictly enforced on MSVC. error C2059: syntax error : static_assert
> >> >> 
> >> >> Signed-off-by: Sairam Venugopal <[email protected]>
> >> >
> >> >I'd really prefer to adjust the definition of BUILD_ASSERT so that it
> >> >can be used in any expression context.  Did you consider that?
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to