http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58071
Bug ID: 58071
Summary: Premature instantiation of default argument
Product: gcc
Version: 4.8.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: rogero at howzatt dot demon.co.uk
If a function is declared with a default argument of a template type the
compiler fails if the constructor cannot be instantiated at the point of
definition of the function.
As I understand it 8.3.6p5 states "The names in the default argument are
bound, and the semantic constraints are checked, at the point where the default
argument appears."
So the compiler can instantiate the *class* definition but I do not believe it
should be instantiating the constructor body unless and until the default
argument is actually *used*.
The code below compiles and links with Clang and icc (and msvc)
Example:
------------------------------------
template <typename T>
class generic
{
public:
generic() { T p; test(p); }
generic(T *) {}
};
class Foo {};
void f(generic<Foo> const & = generic<Foo>());
int main() {}
------------------------------------
g++ -Wall -Wextra 8.3.6p5.cpp
8.3.6p5.cpp: In instantiation of 'generic<T>::generic() [with T = Foo]':
8.3.6p5.cpp:11:44: required from here
8.3.6p5.cpp:5:20: error: 'test' was not declared in this scope