--- Data-Alias-1.18-orig/Alias.xs	2013-09-21 08:02:59.000000000 -0700
+++ Data-Alias-1.18-hsUEy_/Alias.xs	2014-09-10 08:15:07.000000000 -0700
@@ -1800,6 +1800,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;
@@ -1900,8 +1901,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 +1912,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 +1926,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;