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

            Bug ID: 81359
           Summary: [7/8 Regression] bogus error: constructor required
                    before non-static data member for ‘Foo::Bar::test’ has
                    been parsed
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: trippels at gcc dot gnu.org
                CC: jason at gcc dot gnu.org
  Target Milestone: ---

markus@x4 tmp % cat test.cpp
#include <memory>

struct Test;
class Foo {
public:
  Foo();

private:
  struct Bar {
    Bar() = default;
    bool test = false;
  };
  std::unique_ptr<Test, Bar> foo;
};

markus@x4 tmp % g++ -c test.cpp
In file included from
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/move.h:54:0,
                 from
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/stl_pair.h:59,
                 from
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/stl_algobase.h:64,
                 from
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/memory:62,
                 from test.cpp:1:
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits: In
substitution of ‘template<class _Tp, class> static std::true_type
std::__do_is_default_constructible_impl::__test(int) [with _Tp = Foo::Bar;
<template-parameter-1-2> = <missing>]’:
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:892:35:  
required from ‘struct std::__is_default_constructible_impl<Foo::Bar>’
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:143:12:  
required from ‘struct std::__and_<std::__not_<std::is_void<Foo::Bar> >,
std::__is_default_constructible_impl<Foo::Bar> >’
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:896:12:  
required from ‘struct std::__is_default_constructible_atom<Foo::Bar>’
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:917:12:  
required from ‘struct std::__is_default_constructible_safe<Foo::Bar, false>’
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:923:12:  
required from ‘struct std::is_default_constructible<Foo::Bar>’
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:143:12:  
required from ‘struct std::__and_<std::__not_<std::is_pointer<Foo::Bar> >,
std::is_default_constructible<Foo::Bar> >’
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/unique_ptr.h:135:47:
  required from ‘class std::__uniq_ptr_impl<Test, Foo::Bar>’
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/unique_ptr.h:163:33:
  required from ‘class std::unique_ptr<Test, Foo::Bar>’
test.cpp:13:30:   required from here
/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:881:48:
error: constructor required before non-static data member for ‘Foo::Bar::test’
has been parsed
     template<typename _Tp, typename = decltype(_Tp())>
                                                ^~~~~

Reply via email to