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

            Bug ID: 83160
           Summary: [8 regression] lvalue required as unary ‘&’ operand
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: skpgkp1 at gmail dot com
  Target Milestone: ---

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

This issue appear in HHVM build with GCC 8. GCC 7.2.1 works fine with attached
test case.

$ cat File.i.cpp
namespace a {
template <typename b> void ac(b, const b &);
}
int ag;
class c {
  c();
};
template <bool, class...> class C;
C<false> ak();
template <class, bool, class...> class d {
public:
  template <class an> void operator()(an &) const;
  template <class ao> void e(ao) {
    auto appender = [] {};
    (*this)(appender);
  }
  void f() { e(ag); }
};
template <bool, class...> class C : public d<int, 1> {};
template <class be, bool bd, class... aj>
template <class an>
void d<be, bd, aj...>::operator()(an &) const {
  constexpr int bj = 8;
  [](int bk) { a::ac(bk, bj); };
}
c::c() { ak().f(); }

### Fail with GCC 8.0

$g++ --version
g++ (GCC) 8.0.0 20171124 (experimental)
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$g++  -ffunction-sections -fno-delete-null-pointer-checks  -std=gnu++1y
-fno-omit-frame-pointer -fno-operator-names -fdata-sections -fno-gcse
-fno-canonical-system-headers -mcrc32 -O3 --param max-inline-insns-auto=100
--param early-inlining-insns=200 --param max-early-inliner-iterations=50
--param=inline-unit-growth=200 --param=large-unit-insns=10000
-momit-leaf-frame-pointer -Wall -Wextra  -o File.i.cpp.o -c File.i.cpp -Wall
-Wextra
File.i.cpp: In instantiation of ‘void d< <template-parameter-1-1>, <anonymous>,
<template-parameter-1-3> >::operator()(an&) const [with an = d<
<template-parameter-1-1>, <anonymous>, <template-parameter-1-3> >::e(ao) [with
ao = int; <template-parameter-1-1> = int; bool <anonymous> = true;
<template-parameter-1-3> = {}]::<lambda()>; <template-parameter-1-1> = int;
bool <anonymous> = true; <template-parameter-1-3> = {}]’:
File.i.cpp:15:12:   required from ‘void d< <template-parameter-1-1>,
<anonymous>, <template-parameter-1-3> >::e(ao) [with ao = int;
<template-parameter-1-1> = int; bool <anonymous> = true;
<template-parameter-1-3> = {}]’
File.i.cpp:17:14:   required from ‘void d< <template-parameter-1-1>,
<anonymous>, <template-parameter-1-3> >::f() [with <template-parameter-1-1> =
int; bool <anonymous> = true; <template-parameter-1-3> = {}]’
File.i.cpp:26:17:   required from here
File.i.cpp:24:21: error: lvalue required as unary ‘&’ operand
   [](int bk) { a::ac(bk, bj); };
                ~~~~~^~~~~~~~



### Pass with GCC 7.2.1

$g++ --version
g++ (GCC) 7.2.1 20171124
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$g++  -ffunction-sections -fno-delete-null-pointer-checks  -std=gnu++1y
-fno-omit-frame-pointer -fno-operator-names -fdata-sections -fno-gcse
-fno-canonical-system-headers -mcrc32 -O3 --param max-inline-insns-auto=100
--param early-inlining-insns=200 --param max-early-inliner-iterations=50
--param=inline-unit-growth=200 --param=large-unit-insns=10000
-momit-leaf-frame-pointer -Wall -Wextra  -o File.i.cpp.o -c File.i.cpp -Wall
-Wextra
$ echo $?
0

Reply via email to