https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90309

            Bug ID: 90309
           Summary: Spurious warning shift-negative-value
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: philipp.lucas at siemens dot com
  Target Milestone: ---

Created attachment 46272
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46272&action=edit
Test case

Consider the following code:

  struct O { 
    char c;
  };

  typedef void (O::*MP)(void);

  struct Uv : O {
    virtual void v();
    void f();  
  };

  MP mfv=static_cast<MP>(&Uv::f);

When compiled for MIPS, this triggers the following warning:

  > mips-sde-elf-gcc -c -Wshift-negative-value shift.cpp

  warning: left shift of negative value [-Wshift-negative-value]
     MP mfv=static_cast<MP>(&Uv::f);

The reason for this seems to be the left shift in 

  build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p,
                  tsubst_flags_t complain)
  ...
      if (!integer_zerop (n))
        {
          if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta)
              n = cp_build_binary_op (input_location,
                                    LSHIFT_EXPR, n, integer_one_node,
                                    complain);
          delta = cp_build_binary_op (input_location,
                                      PLUS_EXPR, delta, n, complain);
        }

where n->int_cst.val == -4 , which is to be expected.

I do not think such an internally generated shift should give rise to a user
visible warning, which will make the user search in vain for a shift in the
original code.

Reply via email to