This is the mail archive of the
gcc-prs@gcc.gnu.org
mailing list for the GCC project.
c++/99: Re: Bug in type in error message.
- To: gcc-gnats at sourceware dot cygnus dot com
- Subject: c++/99: Re: Bug in type in error message.
- From: "Martin v. Loewis" <martin at loewis dot home dot cs dot tu-berlin dot de>
- Date: Sun, 12 Mar 2000 09:16:50 +0100
- References: <20000306231500.A8852@a2000.nl>
- Resent-Cc: gcc-prs at gcc dot gnu dot org, carlo at alinoe dot com
- Resent-Reply-To: gcc-gnats@gcc.gnu.org, "Martin v. Loewis" <martin@loewis.home.cs.tu-berlin.de>
>Number: 99
>Category: c++
>Synopsis: Bug in type in error message.
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: unassigned
>State: analyzed
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sun Mar 12 00:26:00 PST 2000
>Closed-Date:
>Last-Modified:
>Originator: Carlo Wood <carlo@alinoe.com>
>Release: 2.95.2
>Organization:
>Environment:
>Description:
Date: Mon, 6 Mar 2000 23:15:00 +0100
Original-Message-ID: <20000306231500.A8852@a2000.nl>
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>
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted: