mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-22 21:51:36 +08:00
re PR c++/64487 (internal compiler error: in fold_offsetof_1, at c-family/c-common.c:9857)
PR c++/64487 * semantics.c (finish_offsetof): Handle templates here. * parser.c (cp_parser_builtin_offsetof): Not here. From-SVN: r219267
This commit is contained in:
parent
47867b4f65
commit
b433d944ab
@ -1,5 +1,9 @@
|
||||
2015-01-06 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/64487
|
||||
* semantics.c (finish_offsetof): Handle templates here.
|
||||
* parser.c (cp_parser_builtin_offsetof): Not here.
|
||||
|
||||
PR c++/64496
|
||||
* semantics.c (process_outer_var_ref): Diagnose lambda in local
|
||||
class NSDMI.
|
||||
|
@ -8729,15 +8729,7 @@ cp_parser_builtin_offsetof (cp_parser *parser)
|
||||
}
|
||||
|
||||
success:
|
||||
/* If we're processing a template, we can't finish the semantics yet.
|
||||
Otherwise we can fold the entire expression now. */
|
||||
if (processing_template_decl)
|
||||
{
|
||||
expr = build1 (OFFSETOF_EXPR, size_type_node, expr);
|
||||
SET_EXPR_LOCATION (expr, loc);
|
||||
}
|
||||
else
|
||||
expr = finish_offsetof (expr, loc);
|
||||
expr = finish_offsetof (expr, loc);
|
||||
|
||||
failure:
|
||||
parser->integral_constant_expression_p = save_ice_p;
|
||||
|
@ -3870,6 +3870,15 @@ finish_bases (tree type, bool direct)
|
||||
tree
|
||||
finish_offsetof (tree expr, location_t loc)
|
||||
{
|
||||
/* If we're processing a template, we can't finish the semantics yet.
|
||||
Otherwise we can fold the entire expression now. */
|
||||
if (processing_template_decl)
|
||||
{
|
||||
expr = build1 (OFFSETOF_EXPR, size_type_node, expr);
|
||||
SET_EXPR_LOCATION (expr, loc);
|
||||
return expr;
|
||||
}
|
||||
|
||||
if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
|
||||
{
|
||||
error ("cannot apply %<offsetof%> to destructor %<~%T%>",
|
||||
|
18
gcc/testsuite/g++.dg/template/offsetof3.C
Normal file
18
gcc/testsuite/g++.dg/template/offsetof3.C
Normal file
@ -0,0 +1,18 @@
|
||||
// PR c++/64487
|
||||
|
||||
struct foo {
|
||||
int member;
|
||||
};
|
||||
|
||||
template < int N>
|
||||
struct bar {};
|
||||
|
||||
template <int N>
|
||||
struct qux {
|
||||
static bar<N+__builtin_offsetof(foo,member)> static_member;
|
||||
};
|
||||
|
||||
template <int N>
|
||||
bar<N+__builtin_offsetof(foo,member)> qux<N>::static_member;
|
||||
|
||||
int main() { }
|
Loading…
x
Reference in New Issue
Block a user