decl2.c (build_artificial_parm): Set TREE_READONLY.
* decl2.c (build_artificial_parm): Set TREE_READONLY. * decl.c (bad_specifiers): Allow throw specs on things with pointer-to-function or -member-function type. * init.c (build_default_init): Don't use a CONSTRUCTOR to initialize a pmf. From-SVN: r39810
This commit is contained in:
parent
8084b91ec4
commit
a714e5c5d3
|
@ -1,3 +1,12 @@
|
||||||
|
2001-02-17 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
* decl2.c (build_artificial_parm): Set TREE_READONLY.
|
||||||
|
|
||||||
|
* decl.c (bad_specifiers): Allow throw specs on things with
|
||||||
|
pointer-to-function or -member-function type.
|
||||||
|
* init.c (build_default_init): Don't use a CONSTRUCTOR to initialize
|
||||||
|
a pmf.
|
||||||
|
|
||||||
2001-02-17 Mark Mitchell <mark@codesourcery.com>
|
2001-02-17 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
* call.c (check_dtor_name): Handle template names correctly.
|
* call.c (check_dtor_name): Handle template names correctly.
|
||||||
|
|
|
@ -8638,7 +8638,8 @@ bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises)
|
||||||
object, type);
|
object, type);
|
||||||
if (friendp)
|
if (friendp)
|
||||||
cp_error_at ("`%D' declared as a friend", object);
|
cp_error_at ("`%D' declared as a friend", object);
|
||||||
if (raises)
|
if (raises && !TYPE_PTRFN_P (TREE_TYPE (object))
|
||||||
|
&& !TYPE_PTRMEMFUNC_P (TREE_TYPE (object)))
|
||||||
cp_error_at ("`%D' declared with an exception specification", object);
|
cp_error_at ("`%D' declared with an exception specification", object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -917,6 +917,9 @@ build_artificial_parm (name, type)
|
||||||
|
|
||||||
parm = build_decl (PARM_DECL, name, type);
|
parm = build_decl (PARM_DECL, name, type);
|
||||||
DECL_ARTIFICIAL (parm) = 1;
|
DECL_ARTIFICIAL (parm) = 1;
|
||||||
|
/* All our artificial parms are implicitly `const'; they cannot be
|
||||||
|
assigned to. */
|
||||||
|
TREE_READONLY (parm) = 1;
|
||||||
DECL_ARG_TYPE (parm) = type;
|
DECL_ARG_TYPE (parm) = type;
|
||||||
return parm;
|
return parm;
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,7 +218,7 @@ build_default_init (type)
|
||||||
anything with a CONSTRUCTOR for arrays here, as that would imply
|
anything with a CONSTRUCTOR for arrays here, as that would imply
|
||||||
copy-initialization. */
|
copy-initialization. */
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
else if (AGGREGATE_TYPE_P (type))
|
else if (AGGREGATE_TYPE_P (type) && !TYPE_PTRMEMFUNC_P (type))
|
||||||
{
|
{
|
||||||
/* This is a default initialization of an aggregate, but not one of
|
/* This is a default initialization of an aggregate, but not one of
|
||||||
non-POD class type. We cleverly notice that the initialization
|
non-POD class type. We cleverly notice that the initialization
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Test that we allow simple throw specs on pointers.
|
||||||
|
|
||||||
|
void f() throw () { }
|
||||||
|
void (*pf)() throw () = f;
|
||||||
|
|
||||||
|
struct A
|
||||||
|
{
|
||||||
|
void g() throw () { }
|
||||||
|
static void (A::*pmf)() throw ();
|
||||||
|
};
|
||||||
|
|
||||||
|
void (A::* A::pmf)() = &A::g;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
pf ();
|
||||||
|
A a;
|
||||||
|
(a.*A::pmf)();
|
||||||
|
}
|
Loading…
Reference in New Issue