re PR c++/12932 (ICE with use of ptr-to-function as template arg)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Tue, 18 Nov 2003 15:54:22 +0000 (15:54 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Tue, 18 Nov 2003 15:54:22 +0000 (15:54 +0000)
PR c++/12932
* class.c (currently_open_derived_class): Check if
current_class_type is NULL_TREE.
* semantics.c (finish_call_expr): Check if
currently_open_derived_class returns NULL_TREE.
* cp-tree.h (DERIVED_FROM_P): Add parenthesis around PARENT
parameter.

* g++.dg/template/static5.C: New test.

From-SVN: r73705

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/static5.C [new file with mode: 0644]

index e143dea0ec936a3b7101b434b098143957b7d151..7f75b43e25f89919228fb51602e1d0c4591b71d5 100644 (file)
@@ -1,3 +1,13 @@
+2003-11-18  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/12932
+       * class.c (currently_open_derived_class): Check if
+       current_class_type is NULL_TREE.
+       * semantics.c (finish_call_expr): Check if
+       currently_open_derived_class returns NULL_TREE.
+       * cp-tree.h (DERIVED_FROM_P): Add parenthesis around PARENT
+       parameter.
+
 2003-11-17  Jason Merrill  <jason@redhat.com>
 
        * init.c (build_new_1): Preevaluate placement args.
index 300d8466a01fb226b76d9eae8229dcee845e67bc..1e1b71c94dcf97ac080692657cac731075b7a555 100644 (file)
@@ -5585,6 +5585,9 @@ currently_open_derived_class (tree t)
   if (dependent_type_p (t))
     return NULL_TREE;
 
+  if (!current_class_type)
+    return NULL_TREE;
+
   if (DERIVED_FROM_P (t, current_class_type))
     return current_class_type;
 
index 1c6154f469dc9e3c5445100d26e8a0c40cd7dc7b..75245abfc7b497bebba1b89dd117e35fe59fc1a0 100644 (file)
@@ -1000,7 +1000,7 @@ enum languages { lang_c, lang_cplusplus, lang_java };
 /* Nonzero iff TYPE is derived from PARENT. Ignores accessibility and
    ambiguity issues.  */
 #define DERIVED_FROM_P(PARENT, TYPE) \
-  (lookup_base ((TYPE), PARENT, ba_any, NULL) != NULL_TREE)
+  (lookup_base ((TYPE), (PARENT), ba_any, NULL) != NULL_TREE)
 /* Nonzero iff TYPE is uniquely derived from PARENT. Ignores
    accessibility.  */
 #define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) \
index 13d873430ea36417c7e5c5b5413b8e95b9f7e7a1..cb259726ee85fae276690ae77aaf79d0395c9c9f 100644 (file)
@@ -1638,6 +1638,8 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p)
       if (DECL_FUNCTION_MEMBER_P (f))
        {
          tree type = currently_open_derived_class (DECL_CONTEXT (f));
+         if (!type)
+           type = DECL_CONTEXT (f);
          fn = build_baselink (TYPE_BINFO (type),
                               TYPE_BINFO (type),
                               fn, /*optype=*/NULL_TREE);
index f200f42439922cc888176403c276a9ce3576c70b..fd389b513ef6655446f6a3503e825482a5b5cd6a 100644 (file)
@@ -1,3 +1,8 @@
+2003-11-18  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/12932
+       * g++.dg/template/static5.C: New test.
+
 2003-11-18  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * gcc.dg/nested-func-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/template/static5.C b/gcc/testsuite/g++.dg/template/static5.C
new file mode 100644 (file)
index 0000000..05eaf8f
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Origin: Mirek Fidler <cxl@ntllib.org>
+//         Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/12932: ICE address of static function as template argument
+
+struct Test {
+    static void fun();
+};
+
+template <void (*fun)()>
+void foo () { (*fun)(); }
+
+
+template
+void foo<Test::fun> ();