This is the mail archive of the gcc-patches@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]
Other format: [Raw text]

[C++ PATCH, committed] Fix ICE in make_typename_type (PR9364,10553,10586)


Hi

This patch fixes various crash inside make_typename_type when
parsing illegal code.  There are a few cases to deal with, i.e.
when CONTEXT and NAME are in error, and when CONTEXT is missing.
With the patch, additional checks are added to make_typename_type
to go together with other existing checks for illegal code.

Tested on i686-pc-linux-gnu.  Committed to the trunk as obvious.

--Kriang


2003-05-03  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>

	PR c++/9364, c++/10553, c++/10586
	* decl.c (make_typename_type): Don't crash on illegal code.

2003-05-03  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>

	PR c++/9364, c++/10553, c++/10586
	* g++.dg/parse/typename4.C: New test.
	* g++.dg/parse/typename5.C: Likewise.


diff -cprN gcc-main-save/gcc/cp/decl.c gcc-main-new/gcc/cp/decl.c
*** gcc-main-save/gcc/cp/decl.c	Thu May  1 16:49:56 2003
--- gcc-main-new/gcc/cp/decl.c	Sat May  3 18:43:01 2003
*************** make_typename_type (tree context, tree n
*** 5424,5429 ****
--- 5424,5434 ----
  {
    tree fullname;
  
+   if (name == error_mark_node
+       || context == NULL_TREE
+       || context == error_mark_node)
+     return error_mark_node;
+ 
    if (TYPE_P (name))
      {
        if (!(TYPE_LANG_SPECIFIC (name)
diff -cprN gcc-main-save/gcc/testsuite/g++.dg/parse/typename4.C gcc-main-new/gcc/testsuite/g++.dg/parse/typename4.C
*** gcc-main-save/gcc/testsuite/g++.dg/parse/typename4.C	Thu Jan  1 07:00:00 1970
--- gcc-main-new/gcc/testsuite/g++.dg/parse/typename4.C	Fri May  2 22:29:46 2003
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do compile }
+ 
+ // Origin: Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>
+ 
+ // PR c++/9364: ICE processing typename with name error.
+ 
+ void find(typename int&); // { dg-error "typename|void|expected" }
diff -cprN gcc-main-save/gcc/testsuite/g++.dg/parse/typename5.C gcc-main-new/gcc/testsuite/g++.dg/parse/typename5.C
*** gcc-main-save/gcc/testsuite/g++.dg/parse/typename5.C	Thu Jan  1 07:00:00 1970
--- gcc-main-new/gcc/testsuite/g++.dg/parse/typename5.C	Fri May  2 22:01:24 2003
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile }
+ 
+ // Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+ 
+ // PR c++/10553: ICE processing typename with context error.
+ 
+ template <typename> struct A {};
+ 
+ template <typename> struct B
+ {
+     typedef A<typename X::Y> C; // { dg-error "not a class-name|invalid|no type" }
+ };


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