diff options
author | Martin Liska <mliska@suse.cz> | 2021-03-03 09:38:55 +0100 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2021-03-16 10:54:23 -0400 |
commit | 1c7bec8bfbc5457c1b57d0e3b67f5d6bc8812e57 (patch) | |
tree | cfb2c3641e076ce41f60e86f757cd17b4263ca63 /gcc/testsuite | |
parent | f6e9c1c9191c8b9998e03cb15de8600a2a4b9188 (diff) | |
download | gcc-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.C | 19 |
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); +} |