re PR c++/48936 (sizeof template parm not considered constant expression)
PR c++/48936 * decl2.c (mark_used): Instantiate constant variables even in unevaluated context. From-SVN: r173585
This commit is contained in:
parent
baa175425d
commit
1442bcc841
|
@ -1,3 +1,9 @@
|
|||
2011-05-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/48936
|
||||
* decl2.c (mark_used): Instantiate constant variables even
|
||||
in unevaluated context.
|
||||
|
||||
2011-04-26 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/42687
|
||||
|
|
|
@ -3801,8 +3801,6 @@ possibly_inlined_p (tree decl)
|
|||
void
|
||||
mark_used (tree decl)
|
||||
{
|
||||
HOST_WIDE_INT saved_processing_template_decl = 0;
|
||||
|
||||
/* If DECL is a BASELINK for a single function, then treat it just
|
||||
like the DECL for the function. Otherwise, if the BASELINK is
|
||||
for an overloaded function, we don't know which function was
|
||||
|
@ -3825,9 +3823,6 @@ mark_used (tree decl)
|
|||
error ("used here");
|
||||
return;
|
||||
}
|
||||
/* If we don't need a value, then we don't need to synthesize DECL. */
|
||||
if (skip_evaluation)
|
||||
return;
|
||||
|
||||
/* If within finish_function, defer the rest until that function
|
||||
finishes, otherwise it might recurse. */
|
||||
|
@ -3841,9 +3836,10 @@ mark_used (tree decl)
|
|||
DECL. However, if DECL is a static data member initialized with
|
||||
a constant, we need the value right now because a reference to
|
||||
such a data member is not value-dependent. */
|
||||
if (TREE_CODE (decl) == VAR_DECL
|
||||
&& DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)
|
||||
&& DECL_CLASS_SCOPE_P (decl))
|
||||
if (DECL_INTEGRAL_CONSTANT_VAR_P (decl)
|
||||
&& !DECL_INITIAL (decl)
|
||||
&& DECL_LANG_SPECIFIC (decl)
|
||||
&& DECL_TEMPLATE_INSTANTIATION (decl))
|
||||
{
|
||||
/* Don't try to instantiate members of dependent types. We
|
||||
cannot just use dependent_type_p here because this function
|
||||
|
@ -3853,12 +3849,14 @@ mark_used (tree decl)
|
|||
if (CLASSTYPE_TEMPLATE_INFO ((DECL_CONTEXT (decl)))
|
||||
&& uses_template_parms (CLASSTYPE_TI_ARGS (DECL_CONTEXT (decl))))
|
||||
return;
|
||||
/* Pretend that we are not in a template, even if we are, so
|
||||
that the static data member initializer will be processed. */
|
||||
saved_processing_template_decl = processing_template_decl;
|
||||
processing_template_decl = 0;
|
||||
instantiate_decl (decl, /*defer_ok=*/false,
|
||||
/*expl_inst_class_mem_p=*/false);
|
||||
}
|
||||
|
||||
/* If we don't need a value, then we don't need to synthesize DECL. */
|
||||
if (skip_evaluation)
|
||||
return;
|
||||
|
||||
if (processing_template_decl)
|
||||
return;
|
||||
|
||||
|
@ -3918,8 +3916,6 @@ mark_used (tree decl)
|
|||
need. Therefore, we always try to defer instantiation. */
|
||||
instantiate_decl (decl, /*defer_ok=*/true,
|
||||
/*expl_inst_class_mem_p=*/false);
|
||||
|
||||
processing_template_decl = saved_processing_template_decl;
|
||||
}
|
||||
|
||||
/* Given function PARM_DECL PARM, return its index in the function's list
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2011-05-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* g++.dg/template/nontype23.C: New.
|
||||
|
||||
2011-05-05 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* g++.dg/init/new30.C: New.
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
// PR c++/48936
|
||||
|
||||
template <bool C> int foo (void);
|
||||
template <class T> struct S
|
||||
{
|
||||
static const unsigned int a = sizeof (T);
|
||||
enum { c = sizeof (foo <(a == 0)> ()) };
|
||||
};
|
||||
S<int> x;
|
Loading…
Reference in New Issue