aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2021-12-15 17:27:56 +0100
committerMartin Liska <mliska@suse.cz>2021-12-16 17:49:49 +0100
commit5b8f5a50a93c5fd44fa1ecb6f431fee1df267571 (patch)
treed44a3f87ab74cf460800ef7668a64f1e72a770bc
parentc14f38d4292ec22462a4080841d526f87428130a (diff)
downloadgcc-5b8f5a50a93c5fd44fa1ecb6f431fee1df267571.zip
gcc-5b8f5a50a93c5fd44fa1ecb6f431fee1df267571.tar.gz
gcc-5b8f5a50a93c5fd44fa1ecb6f431fee1df267571.tar.bz2
pragma: respect pragma in lambda functions
In g:01ad8c54fdca we started supporting target pragma changes that are primarily caused by optimization option. The same can happen in the opposite way and we need to check for changes both in optimization_current_node and target_option_current_node. PR c++/103696 gcc/ChangeLog: * attribs.c (decl_attributes): Check if target_option_current_node is changed. gcc/testsuite/ChangeLog: * g++.target/i386/pr103696.C: New test.
-rw-r--r--gcc/attribs.c3
-rw-r--r--gcc/testsuite/g++.target/i386/pr103696.C25
2 files changed, 27 insertions, 1 deletions
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 01a9ed6..29703e7 100644
--- a/gcc/attribs.c
+++ b/gcc/attribs.c
@@ -605,7 +605,8 @@ decl_attributes (tree *node, tree attributes, int flags,
}
if (TREE_CODE (*node) == FUNCTION_DECL
- && optimization_current_node != optimization_default_node
+ && (optimization_current_node != optimization_default_node
+ || target_option_current_node != target_option_default_node)
&& !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node))
{
DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) = optimization_current_node;
diff --git a/gcc/testsuite/g++.target/i386/pr103696.C b/gcc/testsuite/g++.target/i386/pr103696.C
new file mode 100644
index 0000000..de7d5c6
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr103696.C
@@ -0,0 +1,25 @@
+// PR c++/103696
+// { dg-options "-O2 -std=c++14 -fdump-tree-optimized" }
+
+int global_var;
+
+void fn() {
+}
+
+#pragma GCC optimize("finite-math-only")
+#pragma GCC target("sse3")
+
+void fn2() {
+}
+
+void fn3() {
+}
+
+int solve() {
+ auto nested = []() {
+ return global_var;
+ };
+ return nested();
+}
+
+/* { dg-final { scan-tree-dump-not "lambda" "optimized" } } */