This is the mail archive of the gcc-bugs@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]

Bug in type in error message.


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>

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