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: PR 23839


This patch fixes an ICE-on-valid when the "register" keyword is used
with a class type.  The fix is trivial: only check DECL_HARD_REGISTER
for VAR_DECLs.

--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com

2005-09-13  Mark Mitchell  <mark@codesourcery.com>

	PR c++/23839
	* typeck.c (cxx_mark_addressable): Only check DECL_HARD_REGISTER
	for VAR_DECLs.

2005-09-13  Mark Mitchell  <mark@codesourcery.com>

	PR c++/23839
	* g++.dg/parse/register1.C: New test.

Index: gcc/cp/typeck.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/typeck.c,v
retrieving revision 1.652
diff -c -5 -p -r1.652 typeck.c
*** gcc/cp/typeck.c	6 Sep 2005 20:07:02 -0000	1.652
--- gcc/cp/typeck.c	13 Sep 2005 07:50:53 -0000
*************** cxx_mark_addressable (tree exp)
*** 4338,4348 ****
        case CONST_DECL:
        case RESULT_DECL:
  	if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
  	    && !DECL_ARTIFICIAL (x))
  	  {
! 	    if (DECL_HARD_REGISTER (x) != 0)
  	      {
  		error
  		  ("address of explicit register variable %qD requested", x);
  		return false;
  	      }
--- 4338,4348 ----
        case CONST_DECL:
        case RESULT_DECL:
  	if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
  	    && !DECL_ARTIFICIAL (x))
  	  {
! 	    if (TREE_CODE (x) == VAR_DECL && DECL_HARD_REGISTER (x))
  	      {
  		error
  		  ("address of explicit register variable %qD requested", x);
  		return false;
  	      }
Index: gcc/testsuite/g++.dg/parse/register1.C
===================================================================
RCS file: gcc/testsuite/g++.dg/parse/register1.C
diff -N gcc/testsuite/g++.dg/parse/register1.C
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- gcc/testsuite/g++.dg/parse/register1.C	13 Sep 2005 07:50:56 -0000
***************
*** 0 ****
--- 1,14 ----
+ // PR c++/23839
+ 
+ class C
+ {
+   int i;
+ public:
+   C(int j) : i(j) { }
+   operator int() { return i; }
+ };
+ 
+ C f (register C x)
+ {
+   return x + 31;
+ }


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