semantics.c (speculative_access_check): New.
* semantics.c (speculative_access_check): New. * cp-tree.h: Declare it. * call.c (build_over_call): Use it. * class.c (type_has_constexpr_default_constructor): Use locate_ctor. * method.c (locate_ctor): Use push/pop_deferring_access_checks. From-SVN: r166317
This commit is contained in:
parent
f2b01cfb6d
commit
f7d042e273
|
@ -1,3 +1,11 @@
|
|||
2010-11-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* semantics.c (speculative_access_check): New.
|
||||
* cp-tree.h: Declare it.
|
||||
* call.c (build_over_call): Use it.
|
||||
* class.c (type_has_constexpr_default_constructor): Use locate_ctor.
|
||||
* method.c (locate_ctor): Use push/pop_deferring_access_checks.
|
||||
|
||||
2010-11-03 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/46293
|
||||
|
|
|
@ -5823,15 +5823,9 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
|
|||
access_fn = fn;
|
||||
if (flags & LOOKUP_SPECULATIVE)
|
||||
{
|
||||
/* If we're checking for implicit delete, we don't want access
|
||||
control errors. */
|
||||
if (!accessible_p (cand->access_path, access_fn, true))
|
||||
{
|
||||
/* Unless we're under maybe_explain_implicit_delete. */
|
||||
if (flags & LOOKUP_COMPLAIN)
|
||||
enforce_access (cand->access_path, access_fn, fn);
|
||||
return error_mark_node;
|
||||
}
|
||||
if (!speculative_access_check (cand->access_path, access_fn, fn,
|
||||
!!(flags & LOOKUP_COMPLAIN)))
|
||||
return error_mark_node;
|
||||
}
|
||||
else
|
||||
perform_or_defer_access_check (cand->access_path, access_fn, fn);
|
||||
|
|
|
@ -4349,7 +4349,7 @@ type_has_constexpr_default_constructor (tree t)
|
|||
return false;
|
||||
if (CLASSTYPE_LAZY_DEFAULT_CTOR (t))
|
||||
return synthesized_default_constructor_is_constexpr (t);
|
||||
fns = get_default_ctor (t);
|
||||
fns = locate_ctor (t);
|
||||
return (fns && DECL_DECLARED_CONSTEXPR_P (fns));
|
||||
}
|
||||
|
||||
|
|
|
@ -5192,6 +5192,7 @@ extern void pop_to_parent_deferring_access_checks (void);
|
|||
extern void perform_access_checks (VEC (deferred_access_check,gc)*);
|
||||
extern void perform_deferred_access_checks (void);
|
||||
extern void perform_or_defer_access_check (tree, tree, tree);
|
||||
extern bool speculative_access_check (tree, tree, tree, bool);
|
||||
extern int stmts_are_full_exprs_p (void);
|
||||
extern void init_cp_semantics (void);
|
||||
extern tree do_poplevel (tree);
|
||||
|
|
|
@ -849,8 +849,12 @@ get_dtor (tree type)
|
|||
tree
|
||||
locate_ctor (tree type)
|
||||
{
|
||||
tree fn = locate_fn_flags (type, complete_ctor_identifier, NULL_TREE,
|
||||
LOOKUP_SPECULATIVE, tf_none);
|
||||
tree fn;
|
||||
|
||||
push_deferring_access_checks (dk_no_check);
|
||||
fn = locate_fn_flags (type, complete_ctor_identifier, NULL_TREE,
|
||||
LOOKUP_SPECULATIVE, tf_none);
|
||||
pop_deferring_access_checks ();
|
||||
if (fn == error_mark_node)
|
||||
return NULL_TREE;
|
||||
return fn;
|
||||
|
|
|
@ -337,6 +337,30 @@ perform_or_defer_access_check (tree binfo, tree decl, tree diag_decl)
|
|||
new_access->diag_decl = diag_decl;
|
||||
}
|
||||
|
||||
/* Used by build_over_call in LOOKUP_SPECULATIVE mode: return whether DECL
|
||||
is accessible in BINFO, and possibly complain if not. If we're not
|
||||
checking access, everything is accessible. */
|
||||
|
||||
bool
|
||||
speculative_access_check (tree binfo, tree decl, tree diag_decl,
|
||||
bool complain)
|
||||
{
|
||||
if (deferred_access_no_check)
|
||||
return true;
|
||||
|
||||
/* If we're checking for implicit delete, we don't want access
|
||||
control errors. */
|
||||
if (!accessible_p (binfo, decl, true))
|
||||
{
|
||||
/* Unless we're under maybe_explain_implicit_delete. */
|
||||
if (complain)
|
||||
enforce_access (binfo, decl, diag_decl);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Returns nonzero if the current statement is a full expression,
|
||||
i.e. temporaries created during that statement should be destroyed
|
||||
at the end of the statement. */
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2010-11-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* g++.dg/cpp0x/constexpr-access.C: New.
|
||||
|
||||
2010-11-04 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR rtl-optimization/46183
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// { dg-options -std=c++0x }
|
||||
|
||||
class base
|
||||
{
|
||||
protected:
|
||||
constexpr base() { }
|
||||
};
|
||||
|
||||
struct A : base { };
|
||||
|
||||
int main()
|
||||
{
|
||||
A a;
|
||||
}
|
Loading…
Reference in New Issue