This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C++ PATCH: PR 23839
- From: Mark Mitchell <mark at codesourcery dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 13 Sep 2005 07:46:24 -0700
- Subject: C++ PATCH: PR 23839
- Reply-to: mark at codesourcery dot com
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;
+ }