I32 sublen; /* Length of string pointed by subbeg */ \
/* Information about the match that isn't often used */ \
/* offset from wrapped to the start of precomp */ \
- unsigned pre_prefix:4; \
+ PERL_BITFIELD32 pre_prefix:4; \
/* number of eval groups in the pattern - for security checks */\
- unsigned seen_evals:28
+ PERL_BITFIELD32 seen_evals:28
typedef struct regexp {
_XPV_HEAD;
#define RX_WRAPPED(prog) SvPVX(prog)
#define RX_WRAPLEN(prog) SvCUR(prog)
#define RX_CHECK_SUBSTR(prog) (((struct regexp *)SvANY(prog))->check_substr)
-#define RX_EXTFLAGS(prog) RXp_EXTFLAGS((struct regexp *)SvANY(prog))
#define RX_REFCNT(prog) SvREFCNT(prog)
-#define RX_ENGINE(prog) (((struct regexp *)SvANY(prog))->engine)
-#define RX_SUBBEG(prog) (((struct regexp *)SvANY(prog))->subbeg)
-#define RX_OFFS(prog) (((struct regexp *)SvANY(prog))->offs)
-#define RX_NPARENS(prog) (((struct regexp *)SvANY(prog))->nparens)
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define RX_EXTFLAGS(prog) \
+ (*({ \
+ const REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &RXp_EXTFLAGS(SvANY(thwape)); \
+ }))
+# define RX_ENGINE(prog) \
+ (*({ \
+ const REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &SvANY(thwape)->engine; \
+ }))
+# define RX_SUBBEG(prog) \
+ (*({ \
+ const REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &SvANY(thwape)->subbeg; \
+ }))
+# define RX_OFFS(prog) \
+ (*({ \
+ const REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &SvANY(thwape)->offs; \
+ }))
+# define RX_NPARENS(prog) \
+ (*({ \
+ const REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &SvANY(thwape)->nparens; \
+ }))
+#else
+# define RX_EXTFLAGS(prog) RXp_EXTFLAGS((struct regexp *)SvANY(prog))
+# define RX_ENGINE(prog) (((struct regexp *)SvANY(prog))->engine)
+# define RX_SUBBEG(prog) (((struct regexp *)SvANY(prog))->subbeg)
+# define RX_OFFS(prog) (((struct regexp *)SvANY(prog))->offs)
+# define RX_NPARENS(prog) (((struct regexp *)SvANY(prog))->nparens)
+#endif
#define RX_SUBLEN(prog) (((struct regexp *)SvANY(prog))->sublen)
-#define RX_SUBBEG(prog) (((struct regexp *)SvANY(prog))->subbeg)
#define RX_MINLEN(prog) (((struct regexp *)SvANY(prog))->minlen)
#define RX_MINLENRET(prog) (((struct regexp *)SvANY(prog))->minlenret)
#define RX_GOFS(prog) (((struct regexp *)SvANY(prog))->gofs)
#define REXEC_IGNOREPOS 0x08 /* \G matches at start. */
#define REXEC_NOT_FIRST 0x10 /* This is another iteration of //g. */
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
# define ReREFCNT_inc(re) \
({ \
/* This is here to generate a casting warning if incorrect. */ \
REGEXP *const zwapp = (re); \
- (REGEXP *) SvREFCNT_inc(zwapp); \
+ assert(SvTYPE(zwapp) == SVt_REGEXP); \
+ SvREFCNT_inc(zwapp); \
+ zwapp; \
})
# define ReREFCNT_dec(re) \
({ \