aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2021-03-03 09:38:55 +0100
committerJason Merrill <jason@redhat.com>2021-03-16 10:54:23 -0400
commit1c7bec8bfbc5457c1b57d0e3b67f5d6bc8812e57 (patch)
treecfb2c3641e076ce41f60e86f757cd17b4263ca63 /gcc/testsuite
parentf6e9c1c9191c8b9998e03cb15de8600a2a4b9188 (diff)
downloadgcc-1c7bec8bfbc5457c1b57d0e3b67f5d6bc8812e57.zip
gcc-1c7bec8bfbc5457c1b57d0e3b67f5d6bc8812e57.tar.gz
gcc-1c7bec8bfbc5457c1b57d0e3b67f5d6bc8812e57.tar.bz2
c++: support target attr for DECL_LOCAL_DECL_P fns [PR99108]
We crash when target attribute get_function_versions_dispatcher is called for a function that is not registered in call graph. This was happening because we were calling it for the function-local decls that aren't in the symbol table, instead of the corresponding namespace-scope decls that are. gcc/cp/ChangeLog: PR c++/99108 * call.c (get_function_version_dispatcher): Handle DECL_LOCAL_DECL_P. * decl.c (maybe_version_functions): Likewise. (maybe_mark_function_versioned): New. * name-lookup.c (push_local_extern_decl_alias): No longer static. * name-lookup.h (push_local_extern_decl_alias): Adjust. gcc/testsuite/ChangeLog: PR c++/99108 * g++.target/i386/pr99108.C: New test. Co-authored-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/g++.target/i386/pr99108.C19
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.target/i386/pr99108.C b/gcc/testsuite/g++.target/i386/pr99108.C
new file mode 100644
index 0000000..b1f0a71
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr99108.C
@@ -0,0 +1,19 @@
+/* PR c++/99108 */
+/* { dg-require-ifunc "" } */
+
+struct A {
+ template <class T>
+ void foo(T);
+};
+template <class T>
+void A::foo(T)
+{
+ int f(void) __attribute__((target("default")));
+ int f(void) __attribute__((target("arch=atom")));
+ int b = f();
+}
+void bar(void)
+{
+ A c;
+ c.foo(7);
+}