]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/28051 (ICE on invalid conversion operator)
authorLee Millward <lee.millward@gmail.com>
Tue, 11 Jul 2006 17:37:31 +0000 (17:37 +0000)
committerLee Millward <lmillward@gcc.gnu.org>
Tue, 11 Jul 2006 17:37:31 +0000 (17:37 +0000)
PR c++/28051
       * mangle.c (mangle_conv_op_name_for_type): Check for
       invalid types.
       * name-lookup.c (push_class_level_binding): Robustify.
       (do_class_using_decl): Return early if name is
       error_mark_node.

From-SVN: r115352

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/using10.C [new file with mode: 0644]

index 7f2996a5a1350e4a9687b8f50ea9d86374518464..b841f4ab118dcbf6675ef876289f2c217b3e2ef2 100644 (file)
@@ -1,3 +1,12 @@
+2006-07-11  Lee Millward  <lee.millward@gmail.com>
+
+       PR c++/28051
+       * mangle.c (mangle_conv_op_name_for_type): Check for
+       invalid types.
+       * name-lookup.c (push_class_level_binding): Robustify.
+       (do_class_using_decl): Return early if name is
+       error_mark_node.
+       
 2006-07-10  Jason Merrill  <jason@redhat.com>
 
        * class.c (check_field_decls): Fix warning call.
index be1112f811640d1530f34e42b46065a0b244089e..feac3e28a762ca8936a75317ef4def50c08c4afe 100644 (file)
@@ -2771,6 +2771,9 @@ mangle_conv_op_name_for_type (const tree type)
   void **slot;
   tree identifier;
 
+  if (type == error_mark_node)
+    return error_mark_node;
+
   if (conv_type_names == NULL) 
     conv_type_names = htab_create_ggc (31, &hash_type, &compare_type, NULL);
 
index 2d71f3bfa11cd689ebb800590839d5aa6ebd1be3..fb527e2b0fc4f6ee5754c6e1316b24a0b279f183 100644 (file)
@@ -2556,6 +2556,9 @@ push_class_level_binding (tree name, tree x)
   if (!class_binding_level)
     POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, true);
 
+  if (name == error_mark_node)
+    POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, false);
+
   /* Check for invalid member names.  */
   gcc_assert (TYPE_BEING_DEFINED (current_class_type));
   /* We could have been passed a tree list if this is an ambiguous
@@ -2695,6 +2698,9 @@ tree
 do_class_using_decl (tree scope, tree name)
 {
   tree value, type;
+
+  if (name == error_mark_node)
+    return NULL_TREE;
   
   if (!scope || !TYPE_P (scope))
     {
index f4c458402011f57e8edae950fc45ba76d44a6bca..232732f78dd9db5e661407df8fec3e32bf0fdd6f 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-11  Lee Millward  <lee.millward@gmail.com>
+
+       PR c++/28051
+       * g++.dg/template/using10.C: New test.
+       
 2006-07-08  Lee Millward  <lee.millward@gmail.com>
 
        PR c++/27820
diff --git a/gcc/testsuite/g++.dg/template/using10.C b/gcc/testsuite/g++.dg/template/using10.C
new file mode 100644 (file)
index 0000000..ceed63f
--- /dev/null
@@ -0,0 +1,11 @@
+//PR c++/28051
+
+template<int> struct A {};
+
+template<int N> struct B : A<N>
+{
+    using A<N>::operator typename A<N>::X; // { dg-error "no type named" }
+};
+
+B<0> b;