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 for 3.4.2/mainline] Revised patch for PR13092


Hi

This is the revised patch for regression PR13092

	http://gcc.gnu.org/ml/gcc-patches/2004-03/msg01897.html

updated for latest CVS code.  The old one was obsoleted by non-dependent 
code changes it didn't compile original testcases without ICE.  In this
version another chunk of code is added in build_x_unary_op to deal with
non-dependent SCOPE_REF.  (This is a safe approach for 3.4.x.  For long
term, wrapping lookup-ed tree node such as OFFSET_REF in SCOPE_REF is 
probably the approah worth investigating.)

Tested on i686-pc-linux-gnu with no regressions.  OK for mainline
and 3.4.2?

--Kriang

2004-06-21  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>

	PR c++/13092
	* init.c (build_offset_ref): Build SCOPE_REF with non-null
	TREE_TYPE for non-dependent names.
	* typeck.c (build_x_unary_op): Handle non-dependent SCOPE_REF.
	* pt.c (type_dependent_expression_p): Handle SCOPE_REF with
	unknown_type_node as its TREE_TYPE.
	* cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK.
	* error.c (dump_decl) <SCOPE_REF case>: Use pp_expression.
	(dump_expr) <SCOPE_REF case>: Likewise.

2004-06-21  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>

	PR c++/13092
	* g++.dg/template/non-dependent7.C: New test.
	* g++.dg/template/non-dependent8.C: Likewise.
	* g++.dg/template/non-dependent9.C: Likewise.
	* g++.dg/template/non-dependent10.C: Likewise.



diff -cprN gcc-34-save/gcc/cp/cxx-pretty-print.c gcc-34-new/gcc/cp/cxx-pretty-print.c
*** gcc-34-save/gcc/cp/cxx-pretty-print.c	Sat Jun 12 18:53:42 2004
--- gcc-34-new/gcc/cp/cxx-pretty-print.c	Sat Jun 12 22:22:33 2004
*************** pp_cxx_unqualified_id (cxx_pretty_printe
*** 177,182 ****
--- 177,186 ----
        pp_cxx_template_id (pp, t);
        break;
  
+     case BASELINK:
+       pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
+       break;
+ 
      case RECORD_TYPE:
      case UNION_TYPE:
      case ENUMERAL_TYPE:
diff -cprN gcc-34-save/gcc/cp/error.c gcc-34-new/gcc/cp/error.c
*** gcc-34-save/gcc/cp/error.c	Sat Jun 12 18:53:43 2004
--- gcc-34-new/gcc/cp/error.c	Sat Jun 12 22:22:33 2004
*************** dump_decl (tree t, int flags)
*** 814,822 ****
        break;
  
      case SCOPE_REF:
!       dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS);
!       pp_colon_colon (cxx_pp); 
!       dump_decl (TREE_OPERAND (t, 1), flags);
        break;
  
      case ARRAY_REF:
--- 814,820 ----
        break;
  
      case SCOPE_REF:
!       pp_expression (cxx_pp, t);
        break;
  
      case ARRAY_REF:
*************** dump_expr (tree t, int flags)
*** 1735,1743 ****
        break;
  
      case SCOPE_REF:
!       dump_type (TREE_OPERAND (t, 0), flags);
!       pp_colon_colon (cxx_pp);
!       dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
        break;
  
      case CAST_EXPR:
--- 1733,1739 ----
        break;
  
      case SCOPE_REF:
!       pp_expression (cxx_pp, t);
        break;
  
      case CAST_EXPR:
diff -cprN gcc-34-save/gcc/cp/init.c gcc-34-new/gcc/cp/init.c
*** gcc-34-save/gcc/cp/init.c	Sat Jun 12 18:53:43 2004
--- gcc-34-new/gcc/cp/init.c	Fri Jun 18 11:53:32 2004
*************** build_offset_ref (tree type, tree name, 
*** 1378,1384 ****
    if (TREE_CODE (name) == TEMPLATE_DECL)
      return name;
  
!   if (processing_template_decl || uses_template_parms (type))
      return build_min_nt (SCOPE_REF, type, name);
  
    if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
--- 1378,1384 ----
    if (TREE_CODE (name) == TEMPLATE_DECL)
      return name;
  
!   if (dependent_type_p (type) || type_dependent_expression_p (name))
      return build_min_nt (SCOPE_REF, type, name);
  
    if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
*************** build_offset_ref (tree type, tree name, 
*** 1442,1447 ****
--- 1442,1448 ----
        return error_mark_node;
      }
  
+   /* Set up BASEBINFO for member lookup.  */
    decl = maybe_dummy_object (type, &basebinfo);
  
    if (BASELINK_P (name) || DECL_P (name))
*************** build_offset_ref (tree type, tree name, 
*** 1460,1465 ****
--- 1461,1474 ----
        return error_mark_node;
      }
  
+   if (processing_template_decl)
+     {
+       if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
+ 	return build_min (SCOPE_REF, TREE_TYPE (member), type, orig_name);
+       else
+ 	return build_min (SCOPE_REF, TREE_TYPE (member), type, name);
+     }
+ 
    if (TREE_CODE (member) == TYPE_DECL)
      {
        TREE_USED (member) = 1;
diff -cprN gcc-34-save/gcc/cp/pt.c gcc-34-new/gcc/cp/pt.c
*** gcc-34-save/gcc/cp/pt.c	Sat Jun 12 18:53:43 2004
--- gcc-34-new/gcc/cp/pt.c	Sat Jun 19 00:35:08 2004
*************** type_dependent_expression_p (tree expres
*** 11916,11921 ****
--- 11916,11924 ----
  	  if (TREE_CODE (expression) == IDENTIFIER_NODE)
  	    return false;
  	}
+       /* SCOPE_REF with non-null TREE_TYPE is always non-dependent.  */
+       if (TREE_CODE (expression) == SCOPE_REF)
+ 	return false;
        
        if (TREE_CODE (expression) == BASELINK)
  	expression = BASELINK_FUNCTIONS (expression);
diff -cprN gcc-34-save/gcc/cp/typeck.c gcc-34-new/gcc/cp/typeck.c
*** gcc-34-save/gcc/cp/typeck.c	Sat Jun 12 18:53:43 2004
--- gcc-34-new/gcc/cp/typeck.c	Sat Jun 19 19:31:21 2004
*************** build_x_unary_op (enum tree_code code, t
*** 3548,3553 ****
--- 3548,3571 ----
      {
        if (type_dependent_expression_p (xarg))
  	return build_min_nt (code, xarg, NULL_TREE);
+ 
+       /* For non-dependent pointer-to-member, the SCOPE_REF will be
+ 	 processed during template substitution.  Just compute the
+ 	 right type here and build an ADDR_EXPR around it for
+ 	 diagnostics.  */
+       if (code == ADDR_EXPR && TREE_CODE (xarg) == SCOPE_REF)
+ 	{
+ 	  tree type;
+ 	  if (TREE_TYPE (xarg) == unknown_type_node)
+ 	    type = unknown_type_node;
+ 	  else if (TREE_CODE (TREE_TYPE (xarg)) == FUNCTION_TYPE)
+ 	    type = build_pointer_type (TREE_TYPE (xarg));
+ 	  else
+ 	    type = build_ptrmem_type (TREE_OPERAND (xarg, 0),
+ 				      TREE_TYPE (xarg));
+ 	  return build_min (code, type, xarg, NULL_TREE);
+ 	}
+ 
        xarg = build_non_dependent_expr (xarg);
      }
  
diff -cprN gcc-34-save/gcc/testsuite/g++.dg/template/non-dependent10.C gcc-34-new/gcc/testsuite/g++.dg/template/non-dependent10.C
*** gcc-34-save/gcc/testsuite/g++.dg/template/non-dependent10.C	Thu Jan  1 07:00:00 1970
--- gcc-34-new/gcc/testsuite/g++.dg/template/non-dependent10.C	Sat Jun 12 22:22:48 2004
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile }
+ 
+ // Origin: Giovanni Bajo <giovannibajo@libero.it>
+ 
+ // Two-phase name lookup for address of member:
+ // Detecting overloading function error during parsing
+ 
+ struct S
+ {
+   int f(char);
+   int f(int);
+ };
+ 
+ template<int (S::*p)()>
+ struct X
+ {};
+ 
+ template <class T>
+ struct Foo
+ {
+   X<&S::f> x;	// { dg-error "convert|no type" }
+ };
diff -cprN gcc-34-save/gcc/testsuite/g++.dg/template/non-dependent7.C gcc-34-new/gcc/testsuite/g++.dg/template/non-dependent7.C
*** gcc-34-save/gcc/testsuite/g++.dg/template/non-dependent7.C	Thu Jan  1 07:00:00 1970
--- gcc-34-new/gcc/testsuite/g++.dg/template/non-dependent7.C	Sun Jun 13 23:28:03 2004
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile }
+ 
+ // Origin: Giovanni Bajo <giovannibajo@libero.it>
+ 
+ // PR c++/13092: ICE taking address of member which is non-dependent
+ 
+ struct S
+ {
+   int i;
+ };
+ 
+ template<int S::*p>
+ struct X
+ {};
+ 
+ template <class T>
+ struct Foo
+ {
+   X<&S::i> x;
+ };
+ 
+ template struct Foo<void>;
diff -cprN gcc-34-save/gcc/testsuite/g++.dg/template/non-dependent8.C gcc-34-new/gcc/testsuite/g++.dg/template/non-dependent8.C
*** gcc-34-save/gcc/testsuite/g++.dg/template/non-dependent8.C	Thu Jan  1 07:00:00 1970
--- gcc-34-new/gcc/testsuite/g++.dg/template/non-dependent8.C	Sun Jun 13 23:28:02 2004
***************
*** 0 ****
--- 1,21 ----
+ // { dg-do compile }
+ 
+ // Origin: Giovanni Bajo <giovannibajo@libero.it>
+ 
+ // Two-phase name lookup for address of member:
+ // Detecting error during parsing
+ 
+ struct S
+ {
+   char i;
+ };
+ 
+ template<int S::*p>
+ struct X
+ {};
+ 
+ template <class T>
+ struct Foo
+ {
+   X<&S::i> x;	// { dg-error "convert|no type" }
+ };
diff -cprN gcc-34-save/gcc/testsuite/g++.dg/template/non-dependent9.C gcc-34-new/gcc/testsuite/g++.dg/template/non-dependent9.C
*** gcc-34-save/gcc/testsuite/g++.dg/template/non-dependent9.C	Thu Jan  1 07:00:00 1970
--- gcc-34-new/gcc/testsuite/g++.dg/template/non-dependent9.C	Sat Jun 12 22:22:48 2004
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile }
+ 
+ // Origin: Giovanni Bajo <giovannibajo@libero.it>
+ 
+ // Two-phase name lookup for address of member:
+ // Overloading function
+ 
+ struct S
+ {
+   int f();
+   int f(int);
+ };
+ 
+ template<int (S::*p)()>
+ struct X
+ {};
+ 
+ template <class T>
+ struct Foo
+ {
+   X<&S::f> x;
+ };


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