This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Bug in type in error message.
- To: gcc-bugs at gcc dot gnu dot org
- Subject: Bug in type in error message.
- From: Carlo Wood <carlo at alinoe dot com>
- Date: Mon, 6 Mar 2000 23:15:00 +0100
Hi,
I was playing with a rather stupid program when I suddenly ran into
an obscure bug: gcc says "dummy<n>" at a place where it should
say "dummy<m>" in an error message.
The program:
--------------------------------------------------------------------------
#include <iostream>
template<unsigned int p>
class dummy { };
template<unsigned int n, unsigned int m>
double ch(dummy<n>, dummy<m>)
{
if (m > n)
return 0;
return 0.5 * ch(dummy<n - 1>(), dummy<m - 1>()) + 0.5 * ch(dummy<n - 1>(), dummy<m>());
}
template<unsigned int n>
double ch(dummy<n>, dummy<0>)
{
return 0.5 * ch(dummy<n - 1>(), dummy<0>());
}
template<unsigned int m>
double ch(dummy<0>, dummy<m>)
{
if (m > 0)
return 0;
return 1;
}
int main(void)
{
cout << ch(dummy<50>(), dummy<25>()) << endl;
}
--------------------------------------------------------------------------
Reading specs from /usr/local/egcs/lib/gcc-lib/i686-pc-linux-gnu/2.96/specs
gcc version 2.96 20000214 (experimental)
/usr/local/egcs/lib/gcc-lib/i686-pc-linux-gnu/2.96/cpp -lang-c++ -v -iprefix /usr/local/bin/../lib/gcc-lib/i686-pc-linux-gnu/2.96/ -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=96 -D__cplusplus -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__tune_pentiumpro__ theory.cc /tmp/ccI9jELA.ii
GNU CPP version 2.96 20000214 (experimental) (cpplib)
(i386 Linux/ELF)
ignoring nonexistent directory `/usr/local/include/g++-3'
ignoring nonexistent directory `/usr/local/i686-pc-linux-gnu/include'
ignoring nonexistent directory `/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.96/include'
#include "..." search starts here:
#include <...> search starts here:
/usr/local/egcs/include/g++-3
/usr/local/include
/usr/local/egcs/i686-pc-linux-gnu/include
/usr/local/egcs/lib/gcc-lib/i686-pc-linux-gnu/2.96/include
/usr/include
End of search list.
/usr/local/egcs/lib/gcc-lib/i686-pc-linux-gnu/2.96/cc1plus /tmp/ccI9jELA.ii -quiet -dumpbase theory.cc -version -ftemplate-depth-5000 -o /tmp/ccAh9H22.s
GNU C++ version 2.96 20000214 (experimental) (i686-pc-linux-gnu) compiled by GNU C version 2.96 20000214 (experimental).
theory.cc: In function `double ch (dummy<n>, dummy<m>) [with unsigned int n = 1, unsigned int m = 1]':
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 2, unsigned int m = 2]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 3, unsigned int m = 3]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 4, unsigned int m = 4]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 5, unsigned int m = 5]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 6, unsigned int m = 6]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 7, unsigned int m = 7]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 8, unsigned int m = 8]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 9, unsigned int m = 9]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 10, unsigned int m = 10]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 11, unsigned int m = 11]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 12, unsigned int m = 12]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 13, unsigned int m = 13]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 14, unsigned int m = 14]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 15, unsigned int m = 15]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 16, unsigned int m = 16]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 17, unsigned int m = 17]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 18, unsigned int m = 18]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 19, unsigned int m = 19]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 20, unsigned int m = 20]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 21, unsigned int m = 21]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 22, unsigned int m = 22]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 23, unsigned int m = 23]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 24, unsigned int m = 24]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 25, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 26, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 27, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 28, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 29, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 30, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 31, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 32, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 33, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 34, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 35, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 36, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 37, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 38, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 39, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 40, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 41, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 42, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 43, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 44, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 45, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 46, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 47, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 48, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 49, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 50, unsigned int m = 25]'
theory.cc:30: instantiated from here
theory.cc:11: call of overloaded `ch (dummy<0>, dummy<0>)' is ambiguous
theory.cc:8: candidates are: double ch (dummy<n>, dummy<m>) [with unsigned int n = 0, unsigned int m = 0]
theory.cc:16: double ch (dummy<n>, dummy<0>) [with unsigned int n = 0]
theory.cc:22: double ch (dummy<0>, dummy<n>) [with unsigned int m = 0]
^^^^^^^^
\__ INCORRECT
theory.cc: In function `double ch (dummy<n>, dummy<0>) [with unsigned int n = 1]':
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 2, unsigned int m = 1]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 3, unsigned int m = 2]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 4, unsigned int m = 3]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 5, unsigned int m = 4]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 6, unsigned int m = 5]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 7, unsigned int m = 6]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 8, unsigned int m = 7]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 9, unsigned int m = 8]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 10, unsigned int m = 9]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 11, unsigned int m = 10]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 12, unsigned int m = 11]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 13, unsigned int m = 12]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 14, unsigned int m = 13]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 15, unsigned int m = 14]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 16, unsigned int m = 15]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 17, unsigned int m = 16]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 18, unsigned int m = 17]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 19, unsigned int m = 18]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 20, unsigned int m = 19]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 21, unsigned int m = 20]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 22, unsigned int m = 21]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 23, unsigned int m = 22]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 24, unsigned int m = 23]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 25, unsigned int m = 24]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 26, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 27, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 28, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 29, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 30, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 31, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 32, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 33, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 34, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 35, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 36, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 37, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 38, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 39, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 40, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 41, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 42, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 43, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 44, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 45, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 46, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 47, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 48, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 49, unsigned int m = 25]'
theory.cc:11: instantiated from `ch (dummy<n>, dummy<m>) [with unsigned int n = 50, unsigned int m = 25]'
theory.cc:30: instantiated from here
theory.cc:17: call of overloaded `ch (dummy<0>, dummy<0>)' is ambiguous
theory.cc:8: candidates are: double ch (dummy<n>, dummy<m>) [with unsigned int n = 0, unsigned int m = 0]
theory.cc:16: double ch (dummy<n>, dummy<0>) [with unsigned int n = 0]
theory.cc:22: double ch (dummy<0>, dummy<n>) [with unsigned int m = 0]
^^^^^^^^
\__ INCORRECT
theory.cc:22 is:
template<unsigned int m>
double ch(dummy<0>, dummy<m>)
{ <==== line 22
if (m > 0)
return 0;
return 1;
}
Moreover, I feel this should compile anyway - but that is another story ;)
--
Carlo "template torturer" Wood <carlo@alinoe.com>