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.
This commit is contained in:
Martin Liska 2021-12-15 17:27:56 +01:00
parent c14f38d429
commit 5b8f5a50a9
2 changed files with 27 additions and 1 deletions

View file

@ -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;

View file

@ -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" } } */