Commit b433d944 by Jason Merrill Committed by Jason Merrill

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
parent 47867b4f
2015-01-06 Jason Merrill <jason@redhat.com> 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 PR c++/64496
* semantics.c (process_outer_var_ref): Diagnose lambda in local * semantics.c (process_outer_var_ref): Diagnose lambda in local
class NSDMI. class NSDMI.
......
...@@ -8729,15 +8729,7 @@ cp_parser_builtin_offsetof (cp_parser *parser) ...@@ -8729,15 +8729,7 @@ cp_parser_builtin_offsetof (cp_parser *parser)
} }
success: success:
/* If we're processing a template, we can't finish the semantics yet. expr = finish_offsetof (expr, loc);
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);
failure: failure:
parser->integral_constant_expression_p = save_ice_p; parser->integral_constant_expression_p = save_ice_p;
......
...@@ -3870,6 +3870,15 @@ finish_bases (tree type, bool direct) ...@@ -3870,6 +3870,15 @@ finish_bases (tree type, bool direct)
tree tree
finish_offsetof (tree expr, location_t loc) 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) if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
{ {
error ("cannot apply %<offsetof%> to destructor %<~%T%>", error ("cannot apply %<offsetof%> to destructor %<~%T%>",
......
// 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() { }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment