https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83936
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jason at gcc dot gnu.org,
| |nathan at gcc dot gnu.org
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
With:
struct AVX
{
static constexpr const char*const target = "avx";
};
constexpr const char *get_target (const char *x) { return x; }
template<class T>
[[gnu::target(get_target (T::target))]]
void test() {}
void f() {
test<AVX>();
}
what the backend gets is just that <nop_expr <addr_expr <string_cst "avx">>>.
Perhaps we could have some helper function which would look through this and
perhaps handle even the case of a const variable with DECL_INITIAL, and use it
in all the backends for target attribute and perhaps plenty of other attributes
that take STRING_CSTs, like no_sanitize, error, warning, scalar_storage_order,
section, alias, ifunc, visibility, tls_model, simd, deprecated attributes to
just name a few attributes that expect STRING_CST arguments. The question is
if we should do it in each attribute handler or if the C++ FE should do it to
the attribute args first (look through these cases); depends if any attribute
actually can have a useful VAR_DECL or NOP_EXPR or ADDR_EXPR argument...
In any case, too late for GCC8...