Bug 49470 - optional diagnostic not given for invalid mem-initializer in uninstantiated template
Summary: optional diagnostic not given for invalid mem-initializer in uninstantiated t...
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.7.0
: P3 enhancement
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: diagnostic
Depends on:
Blocks:
 
Reported: 2011-06-20 03:05 UTC by Jack Howarth
Modified: 2011-06-22 20:44 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2011-06-22 20:44:17


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jack Howarth 2011-06-20 03:05:50 UTC
Currently g++ doesn't warn or error on invalid code such as...

template <class T> class Array1D {
  Array1D(int n, T *a);
};
template<typename T>
struct A {
  Array1D<int> x;
  A() : x(1, (const int*)0) {}
};

for which clang++ produces the error...

[MacPro:~] howarth% clang++ -c invalid.cc
invalid.cc:7:9: error: no matching constructor for initialization of 'Array1D<int>'
  A() : x(1, (const int*)0) {}
        ^ ~~~~~~~~~~~~~~~~
invalid.cc:2:3: note: candidate constructor not viable: 2nd argument ('const int *') would lose const qualifier
  Array1D(int n, T *a);
  ^
invalid.cc:1:26: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
template <class T> class Array1D {
                         ^
1 error generated.
Comment 1 Jack Howarth 2011-06-20 03:12:23 UTC
This test case originates from http://llvm.org/bugs/show_bug.cgi?id=9627.
Comment 2 Jonathan Wakely 2011-06-20 10:06:13 UTC
If you instantiate the template you get an error.

There are LOTS of things clang diagnoses in uninstantiated templates that g++ doesn't
Comment 3 Jonathan Wakely 2011-06-20 10:26:56 UTC
The summary isn't very relevant, the problem has nothing to do with constructors, it's just that g++ doesn't check before instantiation whether no valid specialization can be formed for a template.

14.6 [temp.res] p7:
If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required. ... [ Note: If a template is instantiated, errors will be diagnosed according to the other rules in this Standard. Exactly when these errors are diagnosed is a quality of implementation issue. β€”end note ]