It appears that CPP decides to stop expansion at some point.

Re-feeding the output to cpp iteratively peels macro levels.

#include <stdlib.h>
#include <stdio.h>

#define _(op, ...) op(__VA_ARGS__)
#define _if(expr, then, els) if (expr) { then; } else { els; }
#define progn(...) ({__VA_ARGS__;})
#define when(expr, ...) _(_if, expr, \
                          _(progn, ## __VA_ARGS__), )
#define unless(expr, ...) _(_if, !(expr), \
                                 _(progn, ## __VA_ARGS__), )
#define warn(format, ...) _(fprintf, stderr, format "\n", ## __VA_ARGS__)
#define when_warn(expr, tail, format, ...) _(when, expr, \
                                              _(warn, format, ## __VA_ARGS__),
\
                                              tail)
#define exssert_with_epilogue_nexpr(expr, epilogue, format, ...) _(when_warn,
expr, _(exit, 1), format, ## __VA_ARGS__)
#define exssert_nexpr(expr, format, ...) _(exssert_with_epilogue_nexpr, expr,
(), format, ## __VA_ARGS__)
#define xmallocq(size) _(progn,                                         \
                          void *gensym = malloc(size);                  \
                          _(exssert_nexpr, gensym == NULL,             \
                             "malloc returned NULL at: %s:%s, line %d",
__FILE__, __FUNCTION__, __LINE__); gensym)

int main()
{
        xmallocq(2000000000);
        exit(0);
}

==>

int main()
{
        ({void *gensym = malloc(2000000000); _(exssert_with_epilogue_nexpr,
gensym == ((void *)0), (), "malloc returned NULL at: %s:%s, line %d","<stdin>",
__FUNCTION__, 88); gensym;});
 exit(0);
}


-- 
           Summary: Function macro nesting depth appears to be uncomfortably
                    limited.
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: preprocessor
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: _deepfire at feelingofgreen dot ru
 GCC build triplet: x86_64-linux-gnu
  GCC host triplet: x86_64-linux-gnu
GCC target triplet: x86_64-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35301

Reply via email to