Use cxx_printable_name for __PRETTY_FUNCTION__ in cp_fname_init.
authorMartin Liska <mliska@suse.cz>
Mon, 2 Sep 2019 07:07:11 +0000 (09:07 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 2 Sep 2019 07:07:11 +0000 (07:07 +0000)
2019-09-02  Martin Liska  <mliska@suse.cz>

PR c++/91155
* c-common.c (fname_as_string): Use cxx_printable_name for
__PRETTY_FUNCTION__ same as was used before r265711.
2019-09-02  Martin Liska  <mliska@suse.cz>

PR c++/91155
* g++.dg/torture/pr91155.C: New test.

From-SVN: r275292

gcc/c-family/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr91155.C [new file with mode: 0644]

index 8b4e75cb78eb1ef59155642025c6170846557ef5..1723dda33c535ec34c18b2b05e976651e6e6a11d 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-02  Martin Liska  <mliska@suse.cz>
+
+       PR c++/91155
+       * c-common.c (fname_as_string): Use cxx_printable_name for
+       __PRETTY_FUNCTION__ same as was used before r265711.
+
 2019-08-28  Marek Polacek  <polacek@redhat.com>
 
        Implement P1152R4: Deprecating some uses of volatile.
index 3497874cb8172e6323cba6355767b83881a51c8d..6de95cdfe798d03fac9da6e2d02fc0d8fb921d7d 100644 (file)
@@ -4511,13 +4511,27 @@ cp_fname_init (const char* name, tree *type_p)
 static tree
 cp_make_fname_decl (location_t loc, tree id, int type_dep)
 {
-  const char *const name = (type_dep && in_template_function ()
-                           ? NULL : fname_as_string (type_dep));
+  const char * name = NULL;
+  bool release_name = false;
+  if (!(type_dep && in_template_function ()))
+    {
+      if (current_function_decl == NULL_TREE)
+       name = "top level";
+      else if (type_dep == 1) /* __PRETTY_FUNCTION__ */
+       name = cxx_printable_name (current_function_decl, 2);
+      else if (type_dep == 0) /* __FUNCTION__ */
+       {
+         name = fname_as_string (type_dep);
+         release_name = true;
+       }
+      else
+       gcc_unreachable ();
+    }
   tree type;
   tree init = cp_fname_init (name, &type);
   tree decl = build_decl (loc, VAR_DECL, id, type);
 
-  if (name)
+  if (release_name)
     free (CONST_CAST (char *, name));
 
   /* As we're using pushdecl_with_scope, we must set the context.  */
index 862e55d481c04fb7bfd9e8b524f29d10df4f5315..947a653d1b94c91a8ac728558bc4a7f631264d5d 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-02  Martin Liska  <mliska@suse.cz>
+
+       PR c++/91155
+       * g++.dg/torture/pr91155.C: New test.
+
 2019-09-01  Marek Polacek  <polacek@redhat.com>
 
        PR c++/91129 - wrong error with binary op in template argument.
diff --git a/gcc/testsuite/g++.dg/torture/pr91155.C b/gcc/testsuite/g++.dg/torture/pr91155.C
new file mode 100644 (file)
index 0000000..04e4f7a
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR c++/91155.  */
+
+template< char C > struct dummy {};
+
+template< typename T > const char *test()
+{
+  __builtin_printf ("test: %s\n", __PRETTY_FUNCTION__);
+  return __PRETTY_FUNCTION__;
+}
+
+int main()
+{
+    if (__builtin_strcmp ("const char* test() [with T = dummy<\'\\000\'>]", test< dummy< '\0' > > ()) != 0)
+    {};//      __builtin_abort ();
+    if (__builtin_strcmp ("const char* test() [with T = dummy<\'\\\'\'>]", test< dummy< '\'' > > ()) != 0)
+    {};//      __builtin_abort ();
+    return 0;
+}