From 9ad4bb1ec3eb37d0a10bf2de7981b7cfec09cbb9 Mon Sep 17 00:00:00 2001
From: austern <austern@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 4 Sep 2003 21:32:48 +0000
Subject: [PATCH] Correct the behavior of __func__ for C++ special member
 functions. 	* c-common.c (fname_as_string): Use
 lang_hooks.decl_printable_name 	with verbosity 0, instead of
 DECL_NAME, for human-readable string. 	* g++.dg/ext/fnname1.C: New test.
 (__func__ for C++.) 	* g++.dg/ext/fnname2.C: Likewise. 	*
 g++.dg/ext/fnname3.C: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@71088 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                      |  5 +++
 gcc/c-common.c                     | 22 +++++-----
 gcc/testsuite/ChangeLog            |  6 +++
 gcc/testsuite/g++.dg/ext/fnname1.C | 26 ++++++++++++
 gcc/testsuite/g++.dg/ext/fnname2.C | 31 ++++++++++++++
 gcc/testsuite/g++.dg/ext/fnname3.C | 65 ++++++++++++++++++++++++++++++
 6 files changed, 145 insertions(+), 10 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/ext/fnname1.C
 create mode 100644 gcc/testsuite/g++.dg/ext/fnname2.C
 create mode 100644 gcc/testsuite/g++.dg/ext/fnname3.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e2c0fc6865d..a3ebefc2ae7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2003-09-04  Matt Austern  <austern@apple.com>
+
+	* c-common.c (fname_as_string): Use lang_hooks.decl_printable_name
+	with verbosity 0, instead of DECL_NAME, for human-readable string.
+	
 2003-09-04  Eric Christopher  <echristo@redhat.com>
 
 	* targhooks.c (default_return_in_memory): Allow
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 9dd18264ff6..69dd0811498 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -1071,16 +1071,18 @@ finish_fname_decls (void)
 const char *
 fname_as_string (int pretty_p)
 {
-  const char *name = NULL;
-
-  if (pretty_p)
-    name = (current_function_decl
-	    ? (*lang_hooks.decl_printable_name) (current_function_decl, 2)
-	    : "top level");
-  else if (current_function_decl && DECL_NAME (current_function_decl))
-    name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
-  else
-    name = "";
+  const char *name = "top level";
+  int vrb = 2;
+
+  if (! pretty_p)
+    {
+      name = "";
+      vrb = 0;
+    }
+
+  if (current_function_decl)
+    name = (*lang_hooks.decl_printable_name) (current_function_decl, vrb);
+
   return name;
 }
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 562ed09c162..c475b9aa008 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2003-09-04  Matt Austern  <austern@apple.com>
+
+	* g++.dg/ext/fnname1.C: New test. (__func__ for C++.)
+	* g++.dg/ext/fnname2.C: Likewise.
+	* g++.dg/ext/fnname3.C: Likewise.
+	
 2003-09-04  Mark Mitchell  <mark@codesourcery.com>
 
 	* g++.dg/expr/lval1.C: New test.
diff --git a/gcc/testsuite/g++.dg/ext/fnname1.C b/gcc/testsuite/g++.dg/ext/fnname1.C
new file mode 100644
index 00000000000..521d5a7367f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/fnname1.C
@@ -0,0 +1,26 @@
+// Test whether __func__ works for namespace-scope C++ functions.
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Matt Austern <austern@apple.com>, 3 Aug 2003
+// { dg-do run }
+
+namespace xyzzy
+{
+  const char* ab6(double, void*)
+  {
+    return __func__;
+  }
+}
+
+int main()
+{
+  const char* s = xyzzy::ab6(2.3, (void*) 0);
+  bool ok = true;
+
+  ok = ok && s[0] == 'a';
+  ok = ok && s[1] == 'b';
+  ok = ok && s[2] == '6';
+  ok = ok && s[3] == '\0';
+
+  return ok ? 0 : 1;
+}
diff --git a/gcc/testsuite/g++.dg/ext/fnname2.C b/gcc/testsuite/g++.dg/ext/fnname2.C
new file mode 100644
index 00000000000..ea0c1826f45
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/fnname2.C
@@ -0,0 +1,31 @@
+// Test whether __func__ works for ordinary member functions.
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Matt Austern <austern@apple.com>, 3 Aug 2003
+// { dg-do run }
+
+struct y8a
+{
+  const char* zqjx(int, char);
+};
+
+const char* y8a::zqjx(int, char)
+{
+  return __func__;
+}
+
+
+int main()
+{
+  y8a tmp;
+  const char* s = tmp.zqjx(16, 'x');
+  bool ok = true;
+
+  ok = ok && s[0] == 'z';
+  ok = ok && s[1] == 'q';
+  ok = ok && s[2] == 'j';
+  ok = ok && s[3] == 'x';
+  ok = ok && s[4] == '\0';
+
+  return ok ? 0 : 1;
+}
diff --git a/gcc/testsuite/g++.dg/ext/fnname3.C b/gcc/testsuite/g++.dg/ext/fnname3.C
new file mode 100644
index 00000000000..c29170a9a39
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/fnname3.C
@@ -0,0 +1,65 @@
+// Test whether __func__ works for constructors and destructors.
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Matt Austern <austern@apple.com>, 3 Aug 2003
+// { dg-do run }
+
+struct uk9i
+{
+  uk9i();
+  ~uk9i();
+
+  static const char* fname;
+  static bool obj_exists;
+};
+
+uk9i::uk9i()
+{
+  obj_exists = true;
+  fname = __func__;
+}
+
+uk9i::~uk9i()
+{
+  obj_exists = false;
+  fname = __func__;
+}
+
+const char* uk9i::fname = 0;
+bool uk9i::obj_exists = false;
+
+int main()
+{
+  bool ok = true;
+
+  ok = ok && uk9i::fname == 0;
+  ok = ok && !uk9i::obj_exists;
+
+  {
+    uk9i tmp;
+    ok = ok && uk9i::obj_exists;
+    ok = ok && uk9i::fname != 0;
+    if (ok)
+      {
+	ok = ok && uk9i::fname[0] == 'u';
+	ok = ok && uk9i::fname[1] == 'k';
+	ok = ok && uk9i::fname[2] == '9';
+	ok = ok && uk9i::fname[3] == 'i';
+	ok = ok && uk9i::fname[4] == '\0';
+      }
+  }
+
+  ok = ok && !uk9i::obj_exists;
+  ok = ok && uk9i::fname != 0;
+  if (ok)
+    {
+      ok = ok && uk9i::fname[0] == '~';
+      ok = ok && uk9i::fname[1] == 'u';
+      ok = ok && uk9i::fname[2] == 'k';
+      ok = ok && uk9i::fname[3] == '9';
+      ok = ok && uk9i::fname[4] == 'i';
+      ok = ok && uk9i::fname[5] == '\0';
+    }  
+
+  return ok ? 0 : 1;
+}
-- 
GitLab