public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/17763] New: Wrong context in error message for template parameter
@ 2004-10-01  2:10 solodon at mail dot com
  2004-10-01  2:19 ` [Bug c++/17763] " solodon at mail dot com
                   ` (14 more replies)
  0 siblings, 15 replies; 16+ messages in thread
From: solodon at mail dot com @ 2004-10-01  2:10 UTC (permalink / raw)
  To: gcc-bugs

It seems that in some cases g++ reports in diagnostic messages type names of
template parameters based on the names used in the first instantiation of the
template and not those that appear in the context of the error. Roughly if A,B,X
and Y are all typedef-ed to int, then g++ can report error about incorrect usage
of class T<X,Y> where it has to report incorrect usage of class T<A,B>. Here is
a small application that reproduces this problem in G++ 3.2 and accordingly to
my professor in 3.4:

#include <map>

int main()
{
  typedef int X;
  typedef int Y;
  typedef std::map<X,Y> XYMap; // X and Y happen to be int

  XYMap xy; // This will instantiate std::map<int,int>

  xy[0] = 1;
  
  typedef int A;
  typedef int B;
  
  typedef std::map<A,B>  ABMap;  // A and B also happen to be int
  typedef std::pair<A,B> ABPair;
  
  ABMap  ab;     // Code for this was already instantiated higher!
  ABPair p(0,1); // Pair of A B. Not relevant, required to generate error
  
  ab[0] = 1;
  
  ABMap::iterator q = ab.begin();
  
  // Here we get an error message, because map's value_type is pair<const A, B>
  // and not pair<A, B> as we try to compare it to.
  // BUT: Look which types are reported as types of map's value_type: 
  // they are X and Y which are completely irrelevant to ABMap! 
  // It seems g++ just peeks the type names of the first instantiation with such
  // actual types, which actually generates code for both maps.
  assert(*q == p);

  return 0;
}

Here is what compiler gives when I run it as: gcc -v -save-temps err_rep.cpp

==8<=========================================================================
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
 /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/cpp0 -lang-c++ -D__GNUG__=3
-D__DEPRECATED -D__EXCEPTIONS -v -D__GNUC__=3 -D__GNUC_MINOR__=2
-D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -D__ELF__ -Dunix -D__gnu_linux__
-Dlinux -D__ELF__ -D__unix__ -D__gnu_linux__ -D__linux__ -D__unix -D__linux
-Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1 -D_GNU_SOURCE -Acpu=i386
-Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i386__ err_rep.cpp err_rep.ii
GNU CPP version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) (cpplib) (i386 Linux/ELF)
ignoring nonexistent directory "/usr/i386-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/3.2.2
 /usr/include/c++/3.2.2/i386-redhat-linux
 /usr/include/c++/3.2.2/backward
 /usr/local/include
 /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include
 /usr/include
End of search list.
 /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/cc1plus -fpreprocessed err_rep.ii
-quiet -dumpbase err_rep.cpp -version -o err_rep.s
GNU CPP version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) (cpplib) (i386 Linux/ELF)
GNU C++ version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) (i386-redhat-linux)
	compiled by GNU C version 3.2.2 20030222 (Red Hat Linux 3.2.2-5).
err_rep.cpp: In function `int main()':
err_rep.cpp:30: no match for `std::pair<const X, Y>& == main()::ABPair&' 
   operator
==8<=========================================================================

Line 30 corresponds to line with assert.

-- 
           Summary: Wrong context in error message for template parameter
           Product: gcc
           Version: 3.2.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: solodon at mail dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: Configured with: ../configure --prefix=/usr --
                    mandir=/usr/share/
  GCC host triplet: gcc version 3.2.2 20030222
GCC target triplet: Red Hat Linux 3.2.2-5


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17763


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2005-09-27 16:22 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-10-01  2:10 [Bug c++/17763] New: Wrong context in error message for template parameter solodon at mail dot com
2004-10-01  2:19 ` [Bug c++/17763] " solodon at mail dot com
2004-10-01  3:20 ` pinskia at gcc dot gnu dot org
2004-10-01  3:30 ` solodon at mail dot com
2004-10-01  3:33 ` gdr at cs dot tamu dot edu
2004-10-01  3:35 ` pinskia at gcc dot gnu dot org
2004-10-01  3:41 ` gdr at cs dot tamu dot edu
2004-10-01 13:13 ` bangerth at dealii dot org
2004-10-01 13:13 ` bangerth at dealii dot org
2004-10-01 13:15 ` bangerth at dealii dot org
2004-10-01 13:33 ` gdr at cs dot tamu dot edu
2004-10-01 15:56 ` bangerth at dealii dot org
2004-10-01 15:57 ` bangerth at dealii dot org
2004-10-01 16:02 ` gdr at cs dot tamu dot edu
2005-08-08 22:10 ` [Bug c++/17763] [3.4/4.0/4.1 Regression] " pinskia at gcc dot gnu dot org
2005-09-27 16:22 ` mmitchel at gcc dot gnu dot org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).