diff -rup Data-Alias-1.18-DKDJpK-orig/Alias.xs Data-Alias-1.18-DKDJpK/Alias.xs
--- Data-Alias-1.18-DKDJpK-orig/Alias.xs	2013-09-21 08:02:59.000000000 -0700
+++ Data-Alias-1.18-DKDJpK/Alias.xs	2014-10-09 08:28:31.000000000 -0700
@@ -133,6 +133,10 @@
 #define op_lvalue(o, t) mod(o, t)
 #endif
 
+#ifndef IS_PADGV
+#define IS_PADGV(x) 0
+#endif
+
 #define DA_HAVE_OP_PADRANGE (PERL_COMBI_VERSION >= 5017006)
 
 #if DA_HAVE_OP_PADRANGE
@@ -1704,6 +1708,7 @@ STATIC int da_transform(pTHX_ OP *op, in
 			break;
 		case OP_AASSIGN:
 			op->op_ppaddr = DataAlias_pp_aassign;
+			op->op_type = OP_CUSTOM;
 			da_aassign(op, kid);
 			MOD(kid);
 			ksib = FALSE;
@@ -1800,6 +1805,7 @@ STATIC void da_peep2(pTHX_ OP *o) {
 	useful = o->op_private & OPpUSEFUL;
 	op_null(o);
 	o->op_ppaddr = PL_ppaddr[OP_NULL];
+	cLISTOPo->op_last = cUNOPx(cLISTOPo->op_first)->op_first;
 	k = o = cLISTOPo->op_first;
 	while ((sib = k->op_sibling))
 		k = sib;
@@ -1859,7 +1865,9 @@ STATIC OP *da_ck_rv2cv(pTHX_ OP *o) {
 		return o; /* not lexing? */
 	kid = cUNOPo->op_first;
 	if (kid->op_type != OP_GV || !DA_ACTIVE || (
-			(cv = GvCV(kGVOP_gv)) != da_cv && cv != da_cvc ))
+		(cv = SvROK(kGVOP_gv)
+			? (CV *)SvRV(kGVOP_gv)
+			: GvCV(kGVOP_gv)) != da_cv && cv != da_cvc ))
 		return o;
 	if (o->op_private & OPpENTERSUB_AMPER)
 		return o;
@@ -1900,8 +1908,9 @@ STATIC OP *da_ck_rv2cv(pTHX_ OP *o) {
 		if ((PL_nexttype[PL_nexttoke++] = yylex()) == '{') {
 			PL_nexttype[PL_nexttoke++] = DO;
 			sv_setpv((SV *) cv, "$");
-			if (PERL_COMBI_VERSION >= 5011002 &&
-					*PL_bufptr == '(') {
+			if ((PERL_COMBI_VERSION >= 5011002 &&
+					*PL_bufptr == '(')
+			   || PERL_COMBI_VERSION >= 5021004) {
 				/*
 				 * A paren here triggers special lexer
 				 * behaviour for a parenthesised argument
@@ -1910,6 +1919,10 @@ STATIC OP *da_ck_rv2cv(pTHX_ OP *o) {
 				 * Suppress it by injecting a semicolon,
 				 * which is otherwise a no-op coming just
 				 * after the opening brace of a block.
+				 * Also inject the semicolon for 5.21.4
+				 * and higher, because our setting of
+				 * PL_expect is undone, as PL_lex_expect
+				 * is not used any more.
 				 */
 				Move(PL_bufptr, PL_bufptr+1,
 					PL_bufend+1-PL_bufptr, char);
@@ -1920,7 +1933,9 @@ STATIC OP *da_ck_rv2cv(pTHX_ OP *o) {
 		}
 		if(PL_lex_state != LEX_KNOWNEXT) {
 			PL_lex_defer = PL_lex_state;
+#if PERL_COMBI_VERSION < 5021004
 			PL_lex_expect = PL_expect;
+#endif
 			PL_lex_state = LEX_KNOWNEXT;
 		}
 		PL_yylval = yylval;