decl_attributes and its caller cplus_decl_attributes sometimes add implicit attributes, e.g. optimize attribute if #pragma GCC optimize is active, target attribute if #pragma GCC target is active, or e.g. omp declare target attribute if in between #pragma omp declare target and #pragma omp end declare target. For templates that seems highly undesirable to me though, they should get those implicit attributes from the spot the templates were parsed (and they do get that), then tsubst through copy_node copies those attributes, but then apply_late_template_attributes can or does add a new set from the spot where they are instantiated, which can be pretty random point of first use of the template. Consider e.g. #pragma GCC push_options #pragma GCC target "avx" template <int N> inline void foo () { } #pragma GCC pop_options #pragma GCC push_options #pragma GCC target "crc32" void bar () { foo<0> (); } #pragma GCC pop_options testcase where the intention is that foo has avx target attribute and bar has crc32 target attribute, but we end up with __attribute__((target ("crc32"), target ("avx"))) on foo<0> (and due to yet another bug actually don't enable avx in foo<0>). In this particular case it is a regression caused by r12-299-ga0fdff3cf33f7284 which apparently calls cplus_decl_attributes even if attributes != NULL but late_attrs is NULL, before those changes we didn't call it in those cases. But, if there is at least one unrelated dependent attribute this would happen already in older releases. The following patch fixes that by temporarily overriding the variables that control the addition of the implicit attributes. Shall we also change the function so that it doesn't call cplus_decl_attributes if late_attrs is NULL, or was that change intentional? 2021-11-19 Jakub Jelinek <jakub@redhat.com> PR c++/101180 * pt.c (apply_late_template_attributes): Temporarily override current_optimize_pragma, optimization_current_node, current_target_pragma and scope_chain->omp_declare_target_attribute, so that cplus_decl_attributes doesn't add implicit attributes. * g++.target/i386/pr101180.C: New test. |
||
---|---|---|
INSTALL | ||
c++tools | ||
config | ||
contrib | ||
fixincludes | ||
gcc | ||
gnattools | ||
gotools | ||
include | ||
intl | ||
libada | ||
libatomic | ||
libbacktrace | ||
libcc1 | ||
libcody | ||
libcpp | ||
libdecnumber | ||
libffi | ||
libgcc | ||
libgfortran | ||
libgo | ||
libgomp | ||
libiberty | ||
libitm | ||
libobjc | ||
liboffloadmic | ||
libphobos | ||
libquadmath | ||
libsanitizer | ||
libssp | ||
libstdc++-v3 | ||
libvtv | ||
lto-plugin | ||
maintainer-scripts | ||
zlib | ||
.dir-locals.el | ||
.gitattributes | ||
.gitignore | ||
ABOUT-NLS | ||
COPYING | ||
COPYING.LIB | ||
COPYING.RUNTIME | ||
COPYING3 | ||
COPYING3.LIB | ||
ChangeLog | ||
ChangeLog.jit | ||
ChangeLog.tree-ssa | ||
MAINTAINERS | ||
Makefile.def | ||
Makefile.in | ||
Makefile.tpl | ||
README | ||
ar-lib | ||
compile | ||
config-ml.in | ||
config.guess | ||
config.rpath | ||
config.sub | ||
configure | ||
configure.ac | ||
depcomp | ||
install-sh | ||
libtool-ldflags | ||
libtool.m4 | ||
ltgcc.m4 | ||
ltmain.sh | ||
ltoptions.m4 | ||
ltsugar.m4 | ||
ltversion.m4 | ||
lt~obsolete.m4 | ||
missing | ||
mkdep | ||
mkinstalldirs | ||
move-if-change | ||
multilib.am | ||
symlink-tree | ||
test-driver | ||
ylwrap |
README
This directory contains the GNU Compiler Collection (GCC). The GNU Compiler Collection is free software. See the files whose names start with COPYING for copying permission. The manuals, and some of the runtime libraries, are under different terms; see the individual source files for details. The directory INSTALL contains copies of the installation information as HTML and plain text. The source of this information is gcc/doc/install.texi. The installation information includes details of what is included in the GCC sources and what files GCC installs. See the file gcc/doc/gcc.texi (together with other files that it includes) for usage and porting information. An online readable version of the manual is in the files gcc/doc/gcc.info*. See http://gcc.gnu.org/bugs/ for how to report bugs usefully. Copyright years on GCC source files may be listed using range notation, e.g., 1987-2012, indicating that every year in the range, inclusive, is a copyrightable year that could otherwise be listed individually.