Bug 18445 - [3.4/4.0 Regression] ice during overload resolution in template instantiation
Summary: [3.4/4.0 Regression] ice during overload resolution in template instantiation
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 3.4.3
: P2 normal
Target Milestone: 4.0.0
Assignee: Volker Reichelt
URL: http://gcc.gnu.org/ml/gcc-patches/200...
Keywords: ice-on-invalid-code, monitored, patch
: 19812 (view as bug list)
Depends on:
Blocks: 18803
  Show dependency treegraph
 
Reported: 2004-11-12 08:42 UTC by Jens Maurer
Modified: 2005-09-17 20:58 UTC (History)
5 users (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build: i686-pc-linux-gnu
Known to work:
Known to fail:
Last reconfirmed: 2005-02-26 18:42:35


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jens Maurer 2004-11-12 08:42:37 UTC
This (invalid) code gives a nice error message with gcc 3.3.3, but fails with an
ICE on 3.4.3.  Using the correct ex.what() syntax fixes the problem.

#include <iostream>
#include <exception>

template<class T>
void f()
{
  try {
  } catch(std::exception& ex) {
    std::cout << ex.what << std::endl;
  }
}

int main()
{
  f<int>();
}


t.cc: In function `void f()':
t.cc:10: internal compiler error: in resolve_overloaded_unification, at cp/pt.c:9331
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
Comment 1 Andrew Pinski 2004-11-12 13:51:45 UTC
Confirmed, reduced to:
struct a
{
  int what();
};
void g(void*);
template<class T>
void f()
{
  a ex;
  g(ex.what);
}

Comment 2 Andrew Pinski 2004-11-12 13:54:41 UTC
: Search converges between 2003-07-08-trunk (#288) and 2003-07-09-trunk (#289).
Comment 3 Volker Reichelt 2004-11-13 19:23:52 UTC
Mark, your patch
http://gcc.gnu.org/ml/gcc-cvs/2003-07/msg00378.html
seems to be responsible for the regression.

Could you please have a look?
Comment 4 CVS Commits 2004-11-25 17:12:09 UTC
Subject: Bug 18445

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	mmitchel@gcc.gnu.org	2004-11-25 17:11:37

Modified files:
	gcc            : ChangeLog c-common.c c-common.h c-typeck.c 
	                 toplev.c 
	gcc/testsuite  : ChangeLog 
	gcc/testsuite/g++.dg/expr: unary2.C 
	gcc/testsuite/g++.dg/ext: lvaddr.C 
	gcc/testsuite/g++.dg/opt: pr7503-3.C 
	gcc/testsuite/g++.old-deja/g++.other: friend7.C 
	gcc/cp         : ChangeLog class.c cp-tree.h decl.c 
	                 name-lookup.c pt.c tree.c typeck.c 
Added files:
	gcc/testsuite/g++.dg/template: crash28.C 
	gcc/testsuite/g++.dg/expr: return1.C 
	gcc/testsuite/g++.dg/parse: qualified3.C 

Log message:
	PR c++/18001
	* c-common.h (lvalue_use): Move here from c-ctypeck.c.
	(lvalue_or_else): Declare.
	* c-common.c (lvalue_or_else): Move here from c-typeck.c.
	* c-typeck.c (lvalue_use): Remove.
	(lvalue_or_else): Remove.
	
	PR c++/18556
	* toplev.c (check_global_declarations): Set DECL_IGNORED_P on
	unemitted variables with static storage duration.
	
	PR c++/18445
	* class.c (instantiate_type): Treat NON_DEPENDENT_EXPRs with
	unknown_type as non matching.  Tidy up.
	* pt.c (build_non_dependent_expr): Do not build a
	NON_DEPENDENT_EXPR for a VAR_DECL.
	
	PR c++/18001
	* cp-tree.h (lvalue_or_else): Remove declaration.
	* tree.c (lvalue_or_else): Remove.
	* typeck.c (build_unary_op): Adjust call to lvalue_or_else.
	(build_modify_expr): Likewise.
	
	PR c++/18625
	* decl.c (duplicate_decls): Return error_mark_node on error, as
	specified.
	
	PR c++/18466
	* decl.c (grokvardecl): Keep track of whether or not a there was
	explicit qualification.
	* name-lookup.c (set_decl_namespace): Complain about explicit
	qualification of a name within its own namespace.
	
	PR c++/18545
	* typeck.c (check_return_expr): Robustify.
	
	PR c++/18445
	* g++.dg/template/crash28.C: Likewise.
	
	PR c++/18001
	* g++.dg/expr/unary2.C: Adjust lvalue messages.
	* g++.dg/ext/lvaddr.C: Likewise.
	* g++.dg/opt/pr7503-3.C: Likewise.
	
	PR c++/18466
	* g++.dg/parse/qualified3.C: New test.
	* g++.old-deja/g++.other/friend7.C: Remove bogus qualification.
	
	PR c++/18545
	* g++.dg/expr/return1.C: New test.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.6549&r2=2.6550
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-common.c.diff?cvsroot=gcc&r1=1.587&r2=1.588
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-common.h.diff?cvsroot=gcc&r1=1.271&r2=1.272
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-typeck.c.diff?cvsroot=gcc&r1=1.400&r2=1.401
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/toplev.c.diff?cvsroot=gcc&r1=1.932&r2=1.933
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.4648&r2=1.4649
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/crash28.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/expr/return1.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/expr/unary2.C.diff?cvsroot=gcc&r1=1.1&r2=1.2
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/ext/lvaddr.C.diff?cvsroot=gcc&r1=1.1&r2=1.2
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/opt/pr7503-3.C.diff?cvsroot=gcc&r1=1.1&r2=1.2
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/qualified3.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.old-deja/g++.other/friend7.C.diff?cvsroot=gcc&r1=1.2&r2=1.3
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.4498&r2=1.4499
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/class.c.diff?cvsroot=gcc&r1=1.689&r2=1.690
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cp-tree.h.diff?cvsroot=gcc&r1=1.1073&r2=1.1074
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl.c.diff?cvsroot=gcc&r1=1.1333&r2=1.1334
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/name-lookup.c.diff?cvsroot=gcc&r1=1.95&r2=1.96
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&r1=1.948&r2=1.949
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/tree.c.diff?cvsroot=gcc&r1=1.419&r2=1.420
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/typeck.c.diff?cvsroot=gcc&r1=1.598&r2=1.599

Comment 5 Mark Mitchell 2004-11-25 17:17:48 UTC
Fixed in GCC 4.0.
Comment 6 Andrew Pinski 2005-02-07 22:03:24 UTC
*** Bug 19812 has been marked as a duplicate of this bug. ***
Comment 7 Volker Reichelt 2005-09-02 07:35:39 UTC
Taking care of the backport to the 3.4 branch.
Comment 8 CVS Commits 2005-09-02 09:15:44 UTC
Subject: Bug 18445

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-3_4-branch
Changes by:	reichelt@gcc.gnu.org	2005-09-02 09:15:11

Modified files:
	gcc/cp         : ChangeLog class.c pt.c 
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/g++.dg/template: crash28.C 

Log message:
	Backport:
	
	2004-11-25  Mark Mitchell  <mark@codesourcery.com>
	PR c++/18445
	* class.c (instantiate_type): Treat NON_DEPENDENT_EXPRs with
	unknown_type as non matching.
	* pt.c (build_non_dependent_expr): Do not build a
	NON_DEPENDENT_EXPR for a VAR_DECL.
	
	* g++.dg/template/crash28.C: New test.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3892.2.235&r2=1.3892.2.236
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/class.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.595.4.11&r2=1.595.4.12
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.816.2.57&r2=1.816.2.58
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3389.2.427&r2=1.3389.2.428
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/crash28.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.46.1

Comment 9 Volker Reichelt 2005-09-02 09:17:07 UTC
Fixed also on the 3.4 branch.
Comment 10 CVS Commits 2005-09-17 20:49:00 UTC
Subject: Bug 18445

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-3_4-branch
Changes by:	reichelt@gcc.gnu.org	2005-09-17 20:48:46

Modified files:
	gcc/cp         : ChangeLog class.c pt.c 
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/g++.dg/template: operator5.C 
Removed files:
	gcc/testsuite/g++.dg/template: crash28.C 

Log message:
	PR c++/18803
	Revert:
	
	2005-09-02  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
	PR c++/18445
	* class.c (instantiate_type): Treat NON_DEPENDENT_EXPRs with
	unknown_type as non matching.
	* pt.c (build_non_dependent_expr): Do not build a
	NON_DEPENDENT_EXPR for a VAR_DECL.
	
	PR c++/18803
	g++.dg/template/operator5.C: New test.
	
	PR c++/18445
	g++.dg/template/crash28.C: Remove.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3892.2.240&r2=1.3892.2.241
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/class.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.595.4.12&r2=1.595.4.13
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.816.2.60&r2=1.816.2.61
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3389.2.434&r2=1.3389.2.435
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/operator5.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.46.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/crash28.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.1.46.1&r2=NONE

Comment 11 Volker Reichelt 2005-09-17 20:58:47 UTC
The fix for the 3.4 branch had to be reverted, because it backported PR 18803.
The problem will not be fixed on the 3.4 branch.
It remains fixed on the 4.0 branch and mainline.