Dodge warning with STATIC_ASSERT_STMT, VMS C++. blead
authorCraig A. Berry <craigberry@mac.com>
Sun, 25 Jan 2015 21:22:50 +0000 (15:22 -0600)
committerCraig A. Berry <craigberry@mac.com>
Sun, 25 Jan 2015 23:08:07 +0000 (17:08 -0600)
This is not a C++11 compiler so it's getting the emulated version
of static_assert and it doesn't like it in one case:

        STATIC_ASSERT_STMT(SVf_FAKE >= 1<<(sizeof(PadnameFLAGS(pn)) * 8));
........^
%CXX-W-REFNESTFUNVAR, reference to local variable of enclosing function is
          not allowed
at line number 3562 in file D0:[craig.blead.ext.B]b.c;1

While pn is in fact a local variable, it's in an enclosing struct,
not an enclosing function.  Nevertheless, we don't actually need
anything from pn other than the size of one of its members, so
we'll just use a NULL pointer of the correct type rather than a
real live instance of that type.  This is supposedly C89 so
shouldn't break anything else.

ext/B/B.pm
ext/B/B.xs

index 5cede48..f028d7c 100644 (file)
@@ -15,7 +15,7 @@ require Exporter;
 # walkoptree comes from B.xs
 
 BEGIN {
-    $B::VERSION = '1.55';
+    $B::VERSION = '1.56';
     @B::EXPORT_OK = ();
 
     # Our BOOT code needs $VERSION set, and will append to @EXPORT_OK.
index 72a33ae..735e2c5 100644 (file)
@@ -2421,7 +2421,7 @@ PadnameFLAGS(pn)
        /* backward-compatibility hack, which should be removed if the
           flags field becomes large enough to hold SVf_FAKE (and
           PADNAMEt_OUTER should be renumbered to match SVf_FAKE) */
-       STATIC_ASSERT_STMT(SVf_FAKE >= 1<<(sizeof(PadnameFLAGS(pn)) * 8));
+       STATIC_ASSERT_STMT(SVf_FAKE >= 1<<(sizeof(PadnameFLAGS((B__PADNAME)NULL)) * 8));
        if (PadnameOUTER(pn))
            RETVAL |= SVf_FAKE;
     OUTPUT: