decl2.c (build_artificial_parm): Set TREE_READONLY.
authorJason Merrill <jason@redhat.com>
Sun, 18 Feb 2001 00:00:29 +0000 (19:00 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 18 Feb 2001 00:00:29 +0000 (19:00 -0500)
        * 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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/init.c
gcc/testsuite/g++.old-deja/g++.eh/spec7.C [new file with mode: 0644]

index 1c557bd0d118c67d7af45be26d56325b6dc9c884..efced16555b52a0031a564e87036da131782175e 100644 (file)
@@ -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>
 
        * call.c (check_dtor_name): Handle template names correctly.
index 7cf983b679b1d47f03c8fe1dfb823daeabe672d2..4e727ad94b9719973db3ace22338e3ef8dbf67cb 100644 (file)
@@ -8638,7 +8638,8 @@ bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises)
              object, type);
   if (friendp)
     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);
 }
 
index 9f79148534ed069c9dd62889fd013250e8f47c67..20aa6a82d726bddd8a97be17479f20575efa7534 100644 (file)
@@ -917,6 +917,9 @@ build_artificial_parm (name, type)
 
   parm = build_decl (PARM_DECL, name, type);
   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;
   return parm;
 }
index 6386f67f8c352df22d2a2f10606d036d48bb93a6..fb6beab8850d7ed6cdcdc8e9522a68e19109b177 100644 (file)
@@ -218,7 +218,7 @@ build_default_init (type)
        anything with a CONSTRUCTOR for arrays here, as that would imply
        copy-initialization.  */
     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
         non-POD class type.  We cleverly notice that the initialization
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/spec7.C b/gcc/testsuite/g++.old-deja/g++.eh/spec7.C
new file mode 100644 (file)
index 0000000..1945b84
--- /dev/null
@@ -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)();
+}