]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* search.c (template_self_reference_p): Tweak.
authorMark Mitchell <mark@codesourcery.com>
Thu, 8 Apr 1999 13:05:50 +0000 (13:05 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 8 Apr 1999 13:05:50 +0000 (13:05 +0000)
From-SVN: r26296

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/cp/search.c
gcc/testsuite/g++.old-deja/g++.other/sizeof1.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.pt/crash34.C [new file with mode: 0644]

index 5dd92144328d17335f375aaa4da90ae20bea2426..21cf5a909f9ec74d9145bc441aab499db732d946 100644 (file)
@@ -1,3 +1,12 @@
+1999-04-08  Mark Mitchell  <mark@codesourcery.com>
+
+       * search.c (template_self_reference_p): Tweak.
+
+1999-04-07  Mark Mitchell  <mark@codesourcery.com>
+
+       * init.c (build_offset_ref): Don't build yet another weird data
+       structure to describe overloaded functions.
+
 1999-04-06  Mark Mitchell  <mark@codesourcery.com>
 
        * cp-tree.h (BASELINK_P): New macro.
index 2769765ef635e324f558e55a248c53a9d6c3815e..c51815f1dcf17290872bb649aca07d3fbbb8acbe 100644 (file)
@@ -1572,7 +1572,7 @@ build_offset_ref (type, name)
 
   /* A lot of this logic is now handled in lookup_field and
      lookup_fnfield.  */
-  if (member && TREE_CODE (member) == TREE_LIST)
+  if (member && BASELINK_P (member))
     {
       /* Go from the TREE_BASELINK to the member function info.  */
       tree fnfields = member;
@@ -1627,9 +1627,8 @@ build_offset_ref (type, name)
          && ! allocation_temporary_p ())
        fnfields = copy_list (fnfields);
 
-      t = build_tree_list (error_mark_node, fnfields);
-      TREE_TYPE (t) = build_offset_type (type, unknown_type_node);
-      return t;
+      TREE_TYPE (fnfields) = build_offset_type (type, unknown_type_node);
+      return fnfields;
     }
 
   t = member;
index 7a13a9f1e0d4e865232f73735c3576fb10554339..4b90e7ebc76be2f044aa5f81ebf1806b9577b2b6 100644 (file)
@@ -1190,6 +1190,7 @@ template_self_reference_p (type, decl)
      tree decl;
 {
   return  (CLASSTYPE_USE_TEMPLATE (type)
+          && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (type))
           && TREE_CODE (decl) == TYPE_DECL
           && DECL_ARTIFICIAL (decl)
           && DECL_NAME (decl) == constructor_name (type));
diff --git a/gcc/testsuite/g++.old-deja/g++.other/sizeof1.C b/gcc/testsuite/g++.old-deja/g++.other/sizeof1.C
new file mode 100644 (file)
index 0000000..6b547ae
--- /dev/null
@@ -0,0 +1,12 @@
+// Build don't link:
+// Origin: Jason Merrill <jason@cygnus.com>
+
+struct X {
+  int f ();
+  int f (int);
+};
+
+void f(int i)
+{
+  i = sizeof(X::f); // ERROR - cannot take sizeof a member function
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash34.C b/gcc/testsuite/g++.old-deja/g++.pt/crash34.C
new file mode 100644 (file)
index 0000000..d178a40
--- /dev/null
@@ -0,0 +1,20 @@
+// Build don't link:
+// Origin: Theodore Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
+
+template <class T>
+class A {
+public:
+        class B { };
+        class C: public B {
+        public:
+                C(A&):B() { }
+        };
+        C f() { return C(*this); }
+};
+
+int
+main()
+{
+        A<int> a;
+        a.f();
+}