This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/16246] [3.3/3.4/3.5 regression] Incorrect template argument deduction
- From: "bangerth at dealii dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 28 Jun 2004 17:09:13 -0000
- Subject: [Bug c++/16246] [3.3/3.4/3.5 regression] Incorrect template argument deduction
- References: <20040628141859.16246.vassili_bourdo@softhome.net>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Additional Comments From bangerth at dealii dot org 2004-06-28 17:09 -------
Confirmed indeed. This is a rather peculiar failure:
----------------
template <typename T> void foo (T, T);
template <unsigned N, unsigned M>
int bar( const char(&val)[M] )
{
foo (N,M);
}
int i = bar<10>("1234");
----------------
g/x> /home/bangerth/bin/gcc-3.4-pre/bin/c++ -c x.cc
x.cc: In function `int bar(const char (&)[M]) [with unsigned int N = 10u,
unsigned int M = 5]':
x.cc:9: instantiated from here
x.cc:6: error: no matching function for call to `foo(unsigned int, int)'
Note that both N and M are declared to be of type unsigned. However, only
N is explicitly specified and M is deduced. From the error message, we
see that M is assumed to be unsigned, but the value given in the template
parameter list doesn't have the 'u' suffix, so it looks like as if gcc
knows that the type is unsigned, but that the node in which the actual
value is stored is a signed integer. This mismatch then causes the failure
of not finding an instance of foo().
This used to work in 2.95, so is a regression.
W.
--
What |Removed |Added
----------------------------------------------------------------------------
Known to fail|3.4.0 3.3.3 3.2.3 3.0.4 |3.4.0 3.3.3 3.2.3 3.0.4
|2.95.3 |
Known to work| |2.95.3
Summary|Incorrect template argument |[3.3/3.4/3.5 regression]
|deduction |Incorrect template argument
| |deduction
Target Milestone|--- |3.4.2
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16246