From 9bbefb7f600019c9d7025281132dd160729bfff2 Mon Sep 17 00:00:00 2001 From: Serge Pavlov Date: Wed, 15 May 2024 23:12:57 +0700 Subject: [PATCH] [clang] Store FPOptions earlier when parsing function (#92146) After https://github.com/llvm/llvm-project/pull/85605 ([clang] Set correct FPOptions if attribute 'optnone' presents) the current FP options in Sema are saved during parsing function because Sema can modify them if optnone is present. However they were saved too late, it caused fails in some cases when precompiled headers are used. This patch moves the storing earlier. --- clang/lib/Parse/Parser.cpp | 4 ++-- clang/test/PCH/optnone.cpp | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 clang/test/PCH/optnone.cpp diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index adcbe5858bc78e..869b9c6669c27f 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -1439,6 +1439,8 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, } } + Sema::FPFeaturesStateRAII SaveFPFeatures(Actions); + // Tell the actions module that we have entered a function definition with the // specified Declarator for the function. SkipBodyInfo SkipBody; @@ -1497,8 +1499,6 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, return Actions.ActOnFinishFunctionBody(Res, nullptr, false); } - Sema::FPFeaturesStateRAII SaveFPFeatures(Actions); - if (Tok.is(tok::kw_try)) return ParseFunctionTryBlock(Res, BodyScope); diff --git a/clang/test/PCH/optnone.cpp b/clang/test/PCH/optnone.cpp new file mode 100644 index 00000000000000..8351bd9de70dd6 --- /dev/null +++ b/clang/test/PCH/optnone.cpp @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -emit-pch -x c++-header %s -o %t.pch +// RUN: %clang_cc1 -emit-llvm -DMAIN -include-pch %t.pch %s -o /dev/null + +#ifndef MAIN +__attribute__((optnone)) void foo() {} +#endif