[flang][preprocessor] Change handling of macros in text from Fortran … (#108113)
…INCLUDE lines The compiler current treats an INCLUDE line as essentially a synonym for a preprocessing #include directive. The causes macros that have been defined at the point where the INCLUDE line is processed to be replaced within the text of the included file. This behavior is surprising to users who expect an INCLUDE line to be expanded into its contents *after* preprocessing has been applied to the original source file, with no further macro expansion. Change INCLUDE line processing to use a fresh instance of Preprocessor containing no macro definitions except _CUDA in CUDA Fortran compilations and, if the original file was being preprocessed, the standard definitions of __FILE__, __LINE__, and so forth.
This commit is contained in:
parent
1ad84d7961
commit
fc1c481cf4
@ -769,7 +769,7 @@ void Preprocessor::Directive(const TokenSequence &dir, Prescanner &prescanner) {
|
||||
if (included->bytes() > 0) {
|
||||
ProvenanceRange fileRange{
|
||||
allSources_.AddIncludedFile(*included, dir.GetProvenanceRange())};
|
||||
Prescanner{prescanner, /*isNestedInIncludeDirective=*/true}
|
||||
Prescanner{prescanner, *this, /*isNestedInIncludeDirective=*/true}
|
||||
.set_encoding(included->encoding())
|
||||
.Prescan(fileRange);
|
||||
}
|
||||
|
@ -32,10 +32,10 @@ Prescanner::Prescanner(Messages &messages, CookedSource &cooked,
|
||||
backslashFreeFormContinuation_{preprocessor.AnyDefinitions()},
|
||||
encoding_{allSources_.encoding()} {}
|
||||
|
||||
Prescanner::Prescanner(const Prescanner &that, bool isNestedInIncludeDirective)
|
||||
: messages_{that.messages_}, cooked_{that.cooked_},
|
||||
preprocessor_{that.preprocessor_}, allSources_{that.allSources_},
|
||||
features_{that.features_},
|
||||
Prescanner::Prescanner(const Prescanner &that, Preprocessor &prepro,
|
||||
bool isNestedInIncludeDirective)
|
||||
: messages_{that.messages_}, cooked_{that.cooked_}, preprocessor_{prepro},
|
||||
allSources_{that.allSources_}, features_{that.features_},
|
||||
isNestedInIncludeDirective_{isNestedInIncludeDirective},
|
||||
backslashFreeFormContinuation_{that.backslashFreeFormContinuation_},
|
||||
inFixedForm_{that.inFixedForm_},
|
||||
@ -1104,7 +1104,14 @@ void Prescanner::FortranInclude(const char *firstQuote) {
|
||||
provenance, static_cast<std::size_t>(p - nextLine_)};
|
||||
ProvenanceRange fileRange{
|
||||
allSources_.AddIncludedFile(*included, includeLineRange)};
|
||||
Prescanner{*this, /*isNestedInIncludeDirective=*/false}
|
||||
Preprocessor cleanPrepro{allSources_};
|
||||
if (preprocessor_.IsNameDefined("__FILE__"s)) {
|
||||
cleanPrepro.DefineStandardMacros(); // __FILE__, __LINE__, &c.
|
||||
}
|
||||
if (preprocessor_.IsNameDefined("_CUDA"s)) {
|
||||
cleanPrepro.Define("_CUDA"s, "1");
|
||||
}
|
||||
Prescanner{*this, cleanPrepro, /*isNestedInIncludeDirective=*/false}
|
||||
.set_encoding(included->encoding())
|
||||
.Prescan(fileRange);
|
||||
}
|
||||
|
@ -35,7 +35,8 @@ class Prescanner {
|
||||
public:
|
||||
Prescanner(Messages &, CookedSource &, Preprocessor &,
|
||||
common::LanguageFeatureControl);
|
||||
Prescanner(const Prescanner &, bool isNestedInIncludeDirective);
|
||||
Prescanner(
|
||||
const Prescanner &, Preprocessor &, bool isNestedInIncludeDirective);
|
||||
Prescanner(const Prescanner &) = delete;
|
||||
Prescanner(Prescanner &&) = delete;
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
!
|
||||
!===------------------------------------------------------------------------===!
|
||||
|
||||
include '../include/flang/Runtime/magic-numbers.h'
|
||||
#include '../include/flang/Runtime/magic-numbers.h'
|
||||
|
||||
! These naming shenanigans prevent names from Fortran intrinsic modules
|
||||
! from being usable on INTRINSIC statements, and force the program
|
||||
|
@ -11,7 +11,7 @@
|
||||
! here under another name so that IEEE_ARITHMETIC can USE it and export its
|
||||
! declarations without clashing with a non-intrinsic module in a program.
|
||||
|
||||
include '../include/flang/Runtime/magic-numbers.h'
|
||||
#include '../include/flang/Runtime/magic-numbers.h'
|
||||
|
||||
module __fortran_ieee_exceptions
|
||||
use __fortran_builtins, only: &
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
! Fortran 2018 Clause 17
|
||||
|
||||
include '../include/flang/Runtime/magic-numbers.h'
|
||||
#include '../include/flang/Runtime/magic-numbers.h'
|
||||
|
||||
module ieee_arithmetic
|
||||
! F18 Clause 17.1p1:
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
! See Fortran 2023, subclause 16.10.2
|
||||
|
||||
include '../include/flang/Runtime/magic-numbers.h'
|
||||
#include '../include/flang/Runtime/magic-numbers.h'
|
||||
|
||||
module iso_fortran_env
|
||||
|
||||
|
@ -51,7 +51,7 @@ program B
|
||||
end
|
||||
|
||||
! include-test-two.f90
|
||||
INCLUDE "basic-header-two.h"
|
||||
#include "basic-header-two.h"
|
||||
#ifdef Y
|
||||
program Y
|
||||
#else
|
||||
|
1
flang/test/Preprocessing/include-file.h
Normal file
1
flang/test/Preprocessing/include-file.h
Normal file
@ -0,0 +1 @@
|
||||
print *, sin(0.), j
|
6
flang/test/Preprocessing/include-line.F90
Normal file
6
flang/test/Preprocessing/include-line.F90
Normal file
@ -0,0 +1,6 @@
|
||||
! RUN: %flang_fc1 -fdebug-unparse %s -Dj=1 2>&1 | FileCheck %s
|
||||
! Ensure that macro definitions don't affect INCLUDE lines (unlike #include)
|
||||
#define sin cos
|
||||
!CHECK: PRINT *, 0._4, j
|
||||
include "include-file.h"
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user