Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package perl-XS-Parse-Keyword for 
openSUSE:Factory checked in at 2022-08-17 18:16:38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-XS-Parse-Keyword (Old)
 and      /work/SRC/openSUSE:Factory/.perl-XS-Parse-Keyword.new.1521 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-XS-Parse-Keyword"

Wed Aug 17 18:16:38 2022 rev:8 rq:997338 version:0.25

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/perl-XS-Parse-Keyword/perl-XS-Parse-Keyword.changes  
    2022-06-28 15:21:43.733884762 +0200
+++ 
/work/SRC/openSUSE:Factory/.perl-XS-Parse-Keyword.new.1521/perl-XS-Parse-Keyword.changes
    2022-08-17 18:23:04.175168450 +0200
@@ -1,0 +2,15 @@
+Wed Jul 27 03:09:17 UTC 2022 - Tina M??ller <timueller+p...@suse.de>
+
+- updated to 0.25
+   see /usr/share/doc/packages/perl-XS-Parse-Keyword/Changes
+
+  0.25    2022-07-25
+          [CHANGES]
+           * Permit infix operators to consume fewer than all the available
+             symbols; allowing for RHS operands that begin with symbols without
+             intervening whitespace
+           * Improved unit-testing of infix operator parser precedence issues
+           * Added `XPI_OPERAND_ARITH`; renumbered `XPI_OPERAND_TERM` to be
+             non-zero. Currently zero is accepted for back-compat
+
+-------------------------------------------------------------------

Old:
----
  XS-Parse-Keyword-0.24.tar.gz

New:
----
  XS-Parse-Keyword-0.25.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-XS-Parse-Keyword.spec ++++++
--- /var/tmp/diff_new_pack.RoDUPo/_old  2022-08-17 18:23:04.563169255 +0200
+++ /var/tmp/diff_new_pack.RoDUPo/_new  2022-08-17 18:23:04.567169263 +0200
@@ -18,7 +18,7 @@
 
 %define cpan_name XS-Parse-Keyword
 Name:           perl-XS-Parse-Keyword
-Version:        0.24
+Version:        0.25
 Release:        0
 License:        Artistic-1.0 OR GPL-1.0-or-later
 Summary:        XS functions to assist in parsing keyword syntax

++++++ XS-Parse-Keyword-0.24.tar.gz -> XS-Parse-Keyword-0.25.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/Changes 
new/XS-Parse-Keyword-0.25/Changes
--- old/XS-Parse-Keyword-0.24/Changes   2022-06-26 20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/Changes   2022-07-26 00:36:23.000000000 +0200
@@ -1,5 +1,14 @@
 Revision history for XS-Parse-Keyword
 
+0.25    2022-07-25
+        [CHANGES]
+         * Permit infix operators to consume fewer than all the available
+           symbols; allowing for RHS operands that begin with symbols without
+           intervening whitespace
+         * Improved unit-testing of infix operator parser precedence issues
+         * Added `XPI_OPERAND_ARITH`; renumbered `XPI_OPERAND_TERM` to be
+           non-zero. Currently zero is accepted for back-compat
+
 0.24    2022-06-26
         [CHANGES]
          * Skip attempting to create duplicate wrapper funcs, in case of
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/META.json 
new/XS-Parse-Keyword-0.25/META.json
--- old/XS-Parse-Keyword-0.24/META.json 2022-06-26 20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/META.json 2022-07-26 00:36:23.000000000 +0200
@@ -40,19 +40,19 @@
    "provides" : {
       "XS::Parse::Infix" : {
          "file" : "lib/XS/Parse/Infix.pm",
-         "version" : "0.24"
+         "version" : "0.25"
       },
       "XS::Parse::Infix::Builder" : {
          "file" : "lib/XS/Parse/Infix/Builder.pm",
-         "version" : "0.24"
+         "version" : "0.25"
       },
       "XS::Parse::Keyword" : {
          "file" : "lib/XS/Parse/Keyword.pm",
-         "version" : "0.24"
+         "version" : "0.25"
       },
       "XS::Parse::Keyword::Builder" : {
          "file" : "lib/XS/Parse/Keyword/Builder.pm",
-         "version" : "0.24"
+         "version" : "0.25"
       }
    },
    "release_status" : "stable",
@@ -61,6 +61,6 @@
          "http://dev.perl.org/licenses/";
       ]
    },
-   "version" : "0.24",
+   "version" : "0.25",
    "x_serialization_backend" : "JSON::PP version 4.06"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/META.yml 
new/XS-Parse-Keyword-0.25/META.yml
--- old/XS-Parse-Keyword-0.24/META.yml  2022-06-26 20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/META.yml  2022-07-26 00:36:23.000000000 +0200
@@ -19,19 +19,19 @@
 provides:
   XS::Parse::Infix:
     file: lib/XS/Parse/Infix.pm
-    version: '0.24'
+    version: '0.25'
   XS::Parse::Infix::Builder:
     file: lib/XS/Parse/Infix/Builder.pm
-    version: '0.24'
+    version: '0.25'
   XS::Parse::Keyword:
     file: lib/XS/Parse/Keyword.pm
-    version: '0.24'
+    version: '0.25'
   XS::Parse::Keyword::Builder:
     file: lib/XS/Parse/Keyword/Builder.pm
-    version: '0.24'
+    version: '0.25'
 requires:
   perl: '5.014'
 resources:
   license: http://dev.perl.org/licenses/
-version: '0.24'
+version: '0.25'
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/XSParseInfix.h 
new/XS-Parse-Keyword-0.25/XSParseInfix.h
--- old/XS-Parse-Keyword-0.24/XSParseInfix.h    2022-06-26 20:38:08.000000000 
+0200
+++ new/XS-Parse-Keyword-0.25/XSParseInfix.h    2022-07-26 00:36:23.000000000 
+0200
@@ -31,13 +31,15 @@
 
 /* lhs_flags, rhs_flags */
 enum {
-  XPI_OPERAND_TERM = 0, /* the "default" termexpr with no context */
   /* other space reserved for other scalar types */
+  XPI_OPERAND_ARITH     = 2,
+  XPI_OPERAND_TERM      = 4,
   XPI_OPERAND_TERM_LIST = 6, /* term in list context */
   XPI_OPERAND_LIST      = 7, /* list in list context */
 
   /* Other bitflags */
   XPI_OPERAND_ONLY_LOOK = (1<<3),
+  XPI_OPERAND_CUSTOM    = (1<<7), /* rhs_flags only */
 };
 
 struct XSParseInfixHooks {
@@ -54,6 +56,9 @@
   /* These hooks are alternatives; the first one defined is used */
   OP *(*new_op)(pTHX_ U32 flags, OP *lhs, OP *rhs, void *hookdata);
   OP *(*ppaddr)(pTHX); /* A pp func used directly in newBINOP_custom() */
+
+  /* Used if rhs_flags & XPI_OPERAND_CUSTOM */
+  OP *(*parse_rhs)(pTHX_ void *hookdata);
 };
 
 struct XSParseInfixInfo {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/hax/perl-backcompat.c.inc 
new/XS-Parse-Keyword-0.25/hax/perl-backcompat.c.inc
--- old/XS-Parse-Keyword-0.24/hax/perl-backcompat.c.inc 2022-06-26 
20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/hax/perl-backcompat.c.inc 2022-07-26 
00:36:23.000000000 +0200
@@ -23,6 +23,7 @@
 typedef SV PADNAME;
 #  define PadnamePV(pn)           (SvPOKp(pn) ? SvPVX(pn) : NULL)
 #  define PadnameLEN(pn)          SvCUR(pn)
+#  define PadnameIsSTATE(pn)      (!!SvPAD_STATE(pn))
 #  define PadnameOUTER(pn)        (SvFAKE(pn) && !SvPAD_STATE(pn))
 #  define PadnamelistARRAY(pnl)   AvARRAY(pnl)
 #  define PadnamelistMAX(pnl)     AvFILLp(pnl)
@@ -31,6 +32,14 @@
 #  define PadMAX(pad)             AvFILLp(pad)
 #endif
 
+#if !HAVE_PERL_VERSION(5, 22, 0)
+#  define CvPADLIST_set(cv, padlist)  (CvPADLIST(cv) = padlist)
+#endif
+
+#ifndef av_count
+#  define av_count(av)           (AvFILL(av) + 1)
+#endif
+
 #ifndef av_top_index
 #  define av_top_index(av)       AvFILL(av)
 #endif
@@ -43,6 +52,10 @@
 #  define block_start(a)         Perl_block_start(aTHX_ a)
 #endif
 
+#ifndef cophh_exists_pvs
+#  define cophh_exists_pvs(a,b,c)  cBOOL(cophh_fetch_pvs(a,b,c))
+#endif
+
 #ifndef cv_clone
 #  define cv_clone(a)            Perl_cv_clone(aTHX_ a)
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix/Builder.pm 
new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix/Builder.pm
--- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix/Builder.pm     2022-06-26 
20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix/Builder.pm     2022-07-26 
00:36:23.000000000 +0200
@@ -3,7 +3,7 @@
 #
 #  (C) Paul Evans, 2021 -- leon...@leonerd.org.uk
 
-package XS::Parse::Infix::Builder 0.24;
+package XS::Parse::Infix::Builder 0.25;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix/Builder_data.pm.PL 
new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix/Builder_data.pm.PL
--- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix/Builder_data.pm.PL     
2022-06-26 20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix/Builder_data.pm.PL     
2022-07-26 00:36:23.000000000 +0200
@@ -28,7 +28,7 @@
    <$in_h> } );
 
 __DATA__
-package XS::Parse::Infix::Builder_data 0.24;
+package XS::Parse::Infix::Builder_data 0.25;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix.pm 
new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix.pm
--- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix.pm     2022-06-26 
20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix.pm     2022-07-26 
00:36:23.000000000 +0200
@@ -3,7 +3,7 @@
 #
 #  (C) Paul Evans, 2021 -- leon...@leonerd.org.uk
 
-package XS::Parse::Infix 0.24;
+package XS::Parse::Infix 0.25;
 
 use v5.14;
 use warnings;
@@ -137,9 +137,13 @@
 
 =over 4
 
-=item XPI_OPERAND_TERM (0)
+=item XPI_OPERAND_ARITH
 
-Default. The operand is a term expression.
+The operand is an arithmetic expression.
+
+=item XPI_OPERAND_TERM
+
+The operand is a term expression.
 
 =item XPI_OPERAND_TERM_LIST
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword/Builder.pm 
new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword/Builder.pm
--- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword/Builder.pm   2022-06-26 
20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword/Builder.pm   2022-07-26 
00:36:23.000000000 +0200
@@ -3,7 +3,7 @@
 #
 #  (C) Paul Evans, 2021 -- leon...@leonerd.org.uk
 
-package XS::Parse::Keyword::Builder 0.24;
+package XS::Parse::Keyword::Builder 0.25;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword/Builder_data.pm.PL 
new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword/Builder_data.pm.PL
--- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword/Builder_data.pm.PL   
2022-06-26 20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword/Builder_data.pm.PL   
2022-07-26 00:36:23.000000000 +0200
@@ -28,7 +28,7 @@
    <$in_h> } );
 
 __DATA__
-package XS::Parse::Keyword::Builder_data 0.24;
+package XS::Parse::Keyword::Builder_data 0.25;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword.pm 
new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword.pm
--- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword.pm   2022-06-26 
20:38:08.000000000 +0200
+++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword.pm   2022-07-26 
00:36:23.000000000 +0200
@@ -3,7 +3,7 @@
 #
 #  (C) Paul Evans, 2021-2022 -- leon...@leonerd.org.uk
 
-package XS::Parse::Keyword 0.24;
+package XS::Parse::Keyword 0.25;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/src/infix.c 
new/XS-Parse-Keyword-0.25/src/infix.c
--- old/XS-Parse-Keyword-0.24/src/infix.c       2022-06-26 20:38:08.000000000 
+0200
+++ new/XS-Parse-Keyword-0.25/src/infix.c       2022-07-26 00:36:23.000000000 
+0200
@@ -73,26 +73,58 @@
 
 static enum OperandShape operand_shape(const struct HooksAndData *hd)
 {
-  U8 args_flags = (hd->hooks->lhs_flags & 0x07) << 4 | (hd->hooks->rhs_flags & 
0x07);
+  U8 lhs_gimme;
+  switch(hd->hooks->lhs_flags & 0x07) {
+    case 0: /* back-compat */
+    case XPI_OPERAND_ARITH:
+    case XPI_OPERAND_TERM:
+      lhs_gimme = G_SCALAR;
+      break;
 
-  switch(args_flags) {
-    /* scalar OP scalar */
+    case XPI_OPERAND_TERM_LIST:
+    case XPI_OPERAND_LIST:
+      lhs_gimme = G_LIST;
+      break;
+
+    default:
+      croak("TODO: Unsure how to classify operand shape of .lhs_flags=%02X\n",
+          hd->hooks->lhs_flags & 0x07);
+  }
+
+  U8 rhs_gimme;
+  switch(hd->hooks->rhs_flags & 0x07) {
+    case 0: /* back-compat */
+    case XPI_OPERAND_ARITH:
     case XPI_OPERAND_TERM:
-      return SHAPE_SCALARSCALAR;
+      rhs_gimme = G_SCALAR;
+      break;
 
-    /* scalar OP list */
     case XPI_OPERAND_TERM_LIST:
     case XPI_OPERAND_LIST:
+      rhs_gimme = G_LIST;
+      break;
+
+    default:
+      croak("TODO: Unsure how to classify operand shape of .rhs_flags=%02X\n",
+          hd->hooks->rhs_flags & 0x07);
+  }
+
+  switch((lhs_gimme << 4) | (rhs_gimme)) {
+    /* scalar OP scalar */
+    case (G_SCALAR<<4) | G_SCALAR:
+      return SHAPE_SCALARSCALAR;
+
+    /* scalar OP list */
+    case (G_SCALAR<<4) | G_LIST:
       return SHAPE_SCALARLIST;
 
     /* list OP list */
-    case (XPI_OPERAND_TERM_LIST<<4) | XPI_OPERAND_TERM_LIST:
-    case (XPI_OPERAND_TERM_LIST<<4) | XPI_OPERAND_LIST:
+    case (G_LIST<<4) | G_LIST:
       return SHAPE_LISTLIST;
 
     default:
-      croak("TODO: Unsure how to classify operand shape of args_flags=%02X\n",
-          args_flags);
+      croak("TODO: Unsure how to classify operand shape of lhs_gimme=%d 
rhs_gimme=%d\n",
+          lhs_gimme, rhs_gimme);
       break;
   }
 }
@@ -217,7 +249,12 @@
   lex_read_space(0);
   OP *rhs = NULL;
 
-  switch(reg->hd.hooks->rhs_flags & 0x07) {
+  switch(reg->hd.hooks->rhs_flags & 0x87) {
+    case XPI_OPERAND_ARITH:
+      rhs = parse_arithexpr(0);
+      break;
+
+    case 0: /* back-compat */
     case XPI_OPERAND_TERM:
       rhs = parse_termexpr(0);
       break;
@@ -230,6 +267,10 @@
       rhs = force_list_keeping_pushmark(parse_listexpr(0));
       break;
 
+    case XPI_OPERAND_CUSTOM:
+      rhs = (*reg->hd.hooks->parse_rhs)(aTHX_ reg->hd.data);
+      break;
+
     default:
       croak("hooks->rhs_flags did not provide a valid RHS type");
   }
@@ -246,13 +287,13 @@
 
   HV *hints = GvHV(PL_hintgv);
 
-  struct Registration *reg;
+  struct Registration *reg, *bestreg = NULL;
   for(reg = registrations; reg; reg = reg->next) {
     /* custom registrations have hooks, builtin ones do not */
     if(!reg->hd.hooks)
       continue;
 
-    if(reg->oplen != oplen || !strEQ(reg->info.opname, op))
+    if(reg->oplen > oplen || !strnEQ(reg->info.opname, op, reg->oplen))
       continue;
 
     if(reg->hd.hooks->permit_hintkey &&
@@ -263,11 +304,20 @@
       !(*reg->hd.hooks->permit)(aTHX_ reg->hd.data))
       continue;
 
-    *def = &reg->def;
-    return oplen;
+    /* This is a candidate and the best one, unless we already have something
+     * longer
+     */
+    if(bestreg && bestreg->oplen > reg->oplen)
+      continue;
+
+    bestreg = reg;
   }
 
-  return (*next_infix_plugin)(aTHX_ op, oplen, def);
+  if(!bestreg)
+    return (*next_infix_plugin)(aTHX_ op, oplen, def);
+
+  *def = &bestreg->def;
+  return bestreg->oplen;
 }
 #endif
 
@@ -622,6 +672,9 @@
   }
 
   switch(hooks->lhs_flags & ~(XPI_OPERAND_ONLY_LOOK)) {
+    case 0:
+      //warn("No .lhs_flags specified for XSParseInfixHooks; defaulting to 
XPI_OPERAND_TERM");
+      /* FALLTHROUGH */
     case XPI_OPERAND_TERM:
     case XPI_OPERAND_TERM_LIST:
       break;
@@ -630,9 +683,14 @@
   }
 
   switch(hooks->rhs_flags & ~(XPI_OPERAND_ONLY_LOOK)) {
+    case 0:
+      //warn("No .rhs_flags specified for XSParseInfixHooks; defaulting to 
XPI_OPERAND_TERM");
+      /* FALLTHROUGH */
+    case XPI_OPERAND_ARITH:
     case XPI_OPERAND_TERM:
     case XPI_OPERAND_TERM_LIST:
     case XPI_OPERAND_LIST:
+    case XPI_OPERAND_CUSTOM:
       break;
     default:
       croak("Unrecognised XSParseInfixHooks.rhs_flags value 0x%X", 
hooks->rhs_flags);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/t/70infix.t 
new/XS-Parse-Keyword-0.25/t/70infix.t
--- old/XS-Parse-Keyword-0.24/t/70infix.t       2022-06-26 20:38:08.000000000 
+0200
+++ new/XS-Parse-Keyword-0.25/t/70infix.t       2022-07-26 00:36:23.000000000 
+0200
@@ -6,16 +6,16 @@
 
 use Test::More;
 
-use B qw( svref_2object walkoptree );
-
 use B::Deparse;
-my $deparser = B::Deparse->new();
+my $deparser = B::Deparse->new( "-p" );
 
 use lib "t";
 use testcase "t::infix";
 
 BEGIN { plan skip_all => "No PL_infix_plugin" unless 
XS::Parse::Infix::HAVE_PL_INFIX_PLUGIN; }
 
+use v5.16;
+
 BEGIN { $^H{"t::infix/permit"} = 1; }
 
 {
@@ -38,6 +38,64 @@
       [ 3, 5, 7 ], 'addpairs infix operator' );
 }
 
+sub _getoptree
+{
+   my ( $sub ) = @_;
+
+   # Ugh - this would be so much neater if we could pass coderefs into
+   # B::walkoptree directly
+   # Additionally there's no pre-mid-postfix walk options :(
+
+   my $dump_optree = sub {
+      my $sub = __SUB__;
+      my ( $op ) = @_;
+      my $opname = $op->name;
+
+      # Avoid test-dependence on the actual ppaddr by mangling out the name
+      $opname =~ s/0x[[:xdigit:]]+/0xXXX/;
+
+      return $op->first->$sub if $opname eq "null";
+
+      my @kids;
+      if( $op->flags & B::OPf_KIDS ) {
+         my $kid = $op->first;
+         while( $kid ) {
+            push @kids, $kid->$sub;
+
+            $kid = $kid->sibling; undef $kid if ref($kid) eq "B::NULL";
+         }
+      }
+
+      my $ret = $opname;
+      $ret .= "[" . join( ", ", @kids ) . "]" if @kids;
+      return $ret;
+   };
+
+   # Reach inside to the first statement
+   return B::svref_2object( $sub )->ROOT->first->first->sibling
+      ->$dump_optree;
+}
+
+sub is_optree
+{
+   my ( $sub, $exp, $name ) = @_;
+   is( _getoptree( $sub ), $exp, $name );
+}
+
+{
+   is_optree sub { $_[0] add $_[1] },
+      "infix_add_0xXXX[aelemfast, aelemfast]",
+      'optree of call to infix operator';
+
+   is_optree sub { $_[0] * $_[1] add $_[2] * $_[3] },
+      "infix_add_0xXXX[multiply[aelemfast, aelemfast], multiply[aelemfast, 
aelemfast]]",
+      'optree of call to infix operator at default precedence';
+
+   is_optree sub { $_[0] * ($_[1] add $_[2]) * $_[3] },
+      "multiply[multiply[aelemfast, infix_add_0xXXX[aelemfast, aelemfast]], 
aelemfast]",
+      'optree of call to infix operator at forced precedence';
+}
+
 sub is_deparsed
 {
    my ( $sub, $exp, $name ) = @_;
@@ -60,6 +118,10 @@
       '$_[0] add $_[1];',
       'deparsed call to infix operator';
 
+   is_deparsed sub { $_[0] * $_[1] add $_[2] * $_[3] },
+      '($_[0] * $_[1]) add ($_[2] * $_[3]);',
+      'deparsed call to infix operator at default precedence';
+
    is_deparsed sub { $_[0] ??? $_[1] },
       '$_[0] ??? $_[1];',
       'deparsed operator yields UTF-8';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.24/t/infix.xs 
new/XS-Parse-Keyword-0.25/t/infix.xs
--- old/XS-Parse-Keyword-0.24/t/infix.xs        2022-06-26 20:38:08.000000000 
+0200
+++ new/XS-Parse-Keyword-0.25/t/infix.xs        2022-07-26 00:36:23.000000000 
+0200
@@ -26,6 +26,8 @@
 }
 
 static const struct XSParseInfixHooks hooks_add = {
+  .lhs_flags = XPI_OPERAND_TERM,
+  .rhs_flags = XPI_OPERAND_TERM,
   .permit_hintkey = hintkey,
   .cls = 0,
 
@@ -44,6 +46,8 @@
 }
 
 static const struct XSParseInfixHooks hooks_xor = {
+  .lhs_flags = XPI_OPERAND_TERM,
+  .rhs_flags = XPI_OPERAND_TERM,
   .permit_hintkey = hintkey,
   .cls = 0,
 
@@ -82,6 +86,7 @@
 }
 
 static const struct XSParseInfixHooks hooks_intersperse = {
+  .lhs_flags = XPI_OPERAND_TERM,
   .rhs_flags = XPI_OPERAND_LIST,
   .permit_hintkey = hintkey,
   .cls = 0,

Reply via email to