This is the mail archive of the gcc-prs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

c++/99: Re: Bug in type in error message.



>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:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]