diff --git a/Zend/tests/gh18026.phpt b/Zend/tests/gh18026.phpt new file mode 100644 index 000000000000..0e33e349b12f --- /dev/null +++ b/Zend/tests/gh18026.phpt @@ -0,0 +1,12 @@ +--TEST-- +GH-18026: Confusing "amp" reference in parser error +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token ")", expecting token "&" in %s on line %d diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index c671b3a295e5..1f117d142c15 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -1819,6 +1819,14 @@ static YYSIZE_T zend_yytnamerr(char *yyres, const char *yystr) return sizeof("\"\\\"")-1; } + /* We used "amp" as a dummy label to avoid a duplicate token literal warning. */ + if (strcmp(toktype, "\"amp\"") == 0) { + if (yyres) { + yystpcpy(yyres, "token \"&\""); + } + return sizeof("token \"&\"")-1; + } + /* Strip off the outer quote marks */ if (toktype_len >= 2 && *toktype == '"') { toktype++;