[Bug c++/61850] New: g++ crashes (SEGV) on the following endless template instantiation

akim.demaille at gmail dot com gcc-bugzilla@gcc.gnu.org
Sat Jul 19 13:28:00 GMT 2014


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

            Bug ID: 61850
           Summary: g++ crashes (SEGV) on the following endless template
                    instantiation
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: akim.demaille at gmail dot com

Hi,

I'm toying with templates and enable_if to try to enforce commutativity on some
operator.  In the course of these experiments, I fell on the following crash. 
I have not tried to scale it down, sorry about that.  I know my program is
wrong.  Maybe eventually I will spend some time to make it smaller, but maybe
that's already good for you.

Cheers.

#include <iostream>

template <typename V1, typename V2, typename Enable = void>
struct join_impl
{
  enum { forward = true };
};

/// T without reference or const/volatile qualifiers.
template <typename T>
using base_t
  = typename std::remove_cv<typename std::remove_reference<T>::type>::type;

template <typename V1, typename V2>
typename join_impl<base_t<V1>, base_t<V2>>::type
join(V1 v1, V2 v2)
{
  return join_impl<base_t<V1>, base_t<V2>>::join(v1, v2);
}

template <typename T>
struct join_impl<T, T>
{
  enum { forward = false };
  using type = T;
  static type join(type v1, type v2)   { return v1 * v2; }
};

template <typename T1, typename T2>
struct join_impl<T1, T2, typename std::enable_if<join_impl<T2,
T1>::forward>::type>
{
  enum { forward = false };
  using super = join_impl<T2, T1>;
  using type = typename super::type;

  static
  type
  join(T1 v1, T2 v2)
  {
    return super::join(v2, v1);
  }
};


int main()
{
  int i = 20;
  float f = 0.1;
#define ECHO(S) std::cerr << #S": " << S << '\n'
  //  ECHO(::join(i, i));
  ECHO(::join(i, f));
  ECHO(::join(f, i));
  ECHO(::join(f, f));
}


g++-mp-4.9 -Wall -std=c++11 v4-without-wrapper.cc
g++-mp-4.9: error: v4-without-wrapper.cc: No such file or directory
g++-mp-4.9: fatal error: no input files
compilation terminated.

g++-mp-4.9 (MacPorts gcc49 4.9-20140416_2) 4.9.0 20140416 (prerelease)
Copyright (C) 2014 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.



More information about the Gcc-bugs mailing list