https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61937
Bug ID: 61937
Summary: Misleading errors due to constructor template deducing
argument as void
Product: gcc
Version: 4.10.0
Status: UNCONFIRMED
Keywords: diagnostic
Severity: minor
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
template<typename T, typename U = void>
struct trait;
template<typename T>
struct trait<T, T>
{
using type = T;
};
template<typename T>
struct trait<T, void>
{
using type = T;
};
struct S {
template<typename T, typename U = typename trait<T>::type>
S(const T&) { }
};
void f() { }
S s = f();
Compiling with -std=c++11 gives four errors:
void.cc: In substitution of ‘template<class T, class U> S::S(const T&) [with T
= void; U = <missing>]’:
void.cc:23:9: required from here
void.cc:17:24: error: ambiguous class template instantiation for ‘struct
trait<void, void>’
template<typename T, typename U = typename trait<T>::type>
^
void.cc:5:10: error: candidates are: struct trait<T, T>
struct trait<T, T>
^
void.cc:11:10: error: struct trait<T, void>
struct trait<T, void>
^
void.cc:23:9: error: conversion from ‘void’ to non-scalar type ‘S’ requested
S s = f();
^
Only the last one is relevant and useful, the others are just confusing.
The first three errors are due to instantiating the constructor template with T
= void but that doesn't make much sense. It implies the function f() returns an
object of type void, rather than returning nothing.