re PR c++/51327 ([c++0x] [4.7 Regression] ICE with invalid constexpr parameter)
/cp 2012-01-29 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51327 * class.c (explain_non_literal_class): Correctly handle implicitly deleted constructors. /testsuite 2012-01-29 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51327 * g++.dg/cpp0x/constexpr-ice6.C: New. From-SVN: r183684
This commit is contained in:
parent
1e86df8d39
commit
efff2fb40e
2 changed files with 32 additions and 1 deletions
|
@ -4910,7 +4910,27 @@ explain_non_literal_class (tree t)
|
|||
"is not a copy or move constructor", t);
|
||||
if (TYPE_HAS_DEFAULT_CONSTRUCTOR (t)
|
||||
&& !type_has_user_provided_default_constructor (t))
|
||||
explain_invalid_constexpr_fn (locate_ctor (t));
|
||||
{
|
||||
/* Note that we can't simply call locate_ctor because when the
|
||||
constructor is deleted it just returns NULL_TREE. */
|
||||
tree fns;
|
||||
for (fns = CLASSTYPE_CONSTRUCTORS (t); fns; fns = OVL_NEXT (fns))
|
||||
{
|
||||
tree fn = OVL_CURRENT (fns);
|
||||
tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
|
||||
|
||||
parms = skip_artificial_parms_for (fn, parms);
|
||||
|
||||
if (sufficient_parms_p (parms))
|
||||
{
|
||||
if (DECL_DELETED_FN (fn))
|
||||
maybe_explain_implicit_delete (fn);
|
||||
else
|
||||
explain_invalid_constexpr_fn (fn);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
11
gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C
Normal file
11
gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C
Normal file
|
@ -0,0 +1,11 @@
|
|||
// PR c++/51327
|
||||
// { dg-options -std=c++0x }
|
||||
|
||||
struct A
|
||||
{
|
||||
A(int);
|
||||
};
|
||||
|
||||
struct B : A {}; // { dg-error "no matching" }
|
||||
|
||||
constexpr int foo(B) { return 0; } // { dg-error "invalid type" }
|
Loading…
Add table
Reference in a new issue