-/* MSVC++ 6.0 (_MSC_VER == 1200) can't compile pp_hot.c with DEBUGGING enabled
- * if we include the following assert(). Must be a compiler bug because it
- * works fine with MSVC++ 7.0. Borland (5.5.1) has the same problem. And MinGW
- * (gcc-3.4.2) has a different problem when compiling win32/perllib.c! */
-#if defined(DEBUGGING) && \
- ((!defined(_MSC_VER) || _MSC_VER > 1200) && \
- !defined(__BORLANDC__) && !defined(__MINGW32__))
-# define GvGP(gv) (*(assert(SvTYPE(gv) == SVt_PVGV || \
- SvTYPE(gv) == SVt_PVLV), \
- &(GvXPVGV(gv)->xgv_gp)))
+
+#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__INTEL_COMPILER)
+# define GvGP(gv) \
+ (*({GV *const shplep = (GV *) (gv); \
+ assert(SvTYPE(shplep) == SVt_PVGV || SvTYPE(shplep) == SVt_PVLV); \
+ assert(isGV_with_GP(shplep)); \
+ &((shplep)->sv_u.svu_gp);}))
+# define GvFLAGS(gv) \
+ (*({GV *const yaah = (GV *) (gv); \
+ assert(SvTYPE(yaah) == SVt_PVGV || SvTYPE(yaah) == SVt_PVLV); \
+ assert(isGV_with_GP(yaah)); \
+ &(GvXPVGV(yaah)->xpv_cur);}))
+# define GvSTASH(gv) \
+ (*({ GV * const _gv = (GV *) (gv); \
+ assert(isGV_with_GP(_gv)); \
+ assert(SvTYPE(_gv) == SVt_PVGV || SvTYPE(_gv) >= SVt_PVLV); \
+ &(GvXPVGV(_gv)->xnv_u.xgv_stash); \
+ }))
+# define GvNAME_HEK(gv) \
+ (*({ GV * const zzzz = (GV *) (gv); \
+ assert(isGV_with_GP(zzzz)); \
+ assert(SvTYPE(zzzz) == SVt_PVGV || SvTYPE(zzzz) >= SVt_PVLV); \
+ &(GvXPVGV(zzzz)->xiv_u.xivu_namehek); \
+ }))
+# define GvNAME_get(gv) ({ assert(GvNAME_HEK(gv)); HEK_KEY(GvNAME_HEK(gv)); })
+# define GvNAMELEN_get(gv) ({ assert(GvNAME_HEK(gv)); HEK_LEN(GvNAME_HEK(gv)); })