re PR c++/35741 (ICE with offsetof and references)

PR c++/35741
	* semantics.c (finish_offsetof): Undo effect of convert_from_reference
	before calling fold_offsetof.

	* g++.dg/other/offsetof5.C: New test.

From-SVN: r133863
This commit is contained in:
Jakub Jelinek 2008-04-03 09:43:46 +02:00 committed by Jakub Jelinek
parent 6cba282a2c
commit 60c4d1358a
4 changed files with 35 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2008-04-03 Jakub Jelinek <jakub@redhat.com>
PR c++/35741
* semantics.c (finish_offsetof): Undo effect of convert_from_reference
before calling fold_offsetof.
2008-04-03 Tom Tromey <tromey@redhat.com>
* Make-lang.in (c++_OBJS): New variable.

View File

@ -3039,6 +3039,8 @@ finish_offsetof (tree expr)
error ("cannot apply %<offsetof%> to member function %qD", expr);
return error_mark_node;
}
if (TREE_CODE (expr) == INDIRECT_REF && REFERENCE_REF_P (expr))
expr = TREE_OPERAND (expr, 0);
return fold_offsetof (expr, NULL_TREE);
}

View File

@ -1,3 +1,8 @@
2008-04-03 Jakub Jelinek <jakub@redhat.com>
PR c++/35741
* g++.dg/other/offsetof5.C: New test.
2008-04-03 Paolo Bonzini <bonzini@gnu.org>
PR rtl-optimization/35281

View File

@ -0,0 +1,22 @@
// PR c++/35741
// { dg-do compile }
#include <stddef.h>
struct A
{
char c;
int &i;
};
int j = offsetof (A, i); // { dg-warning "invalid access|offsetof" }
template <typename T>
struct S
{
T h;
T &i;
static const int j = offsetof (S, i); // { dg-warning "invalid access|offsetof" }
};
int k = S<int>::j; // { dg-warning "instantiated from here" }