diff --git a/flang/lib/Parser/preprocessor.cpp b/flang/lib/Parser/preprocessor.cpp index 7d3130cd66ed99..cb3725bc4ea67e 100644 --- a/flang/lib/Parser/preprocessor.cpp +++ b/flang/lib/Parser/preprocessor.cpp @@ -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); } diff --git a/flang/lib/Parser/prescan.cpp b/flang/lib/Parser/prescan.cpp index 7dcb61ac79109f..b594df8ecb6858 100644 --- a/flang/lib/Parser/prescan.cpp +++ b/flang/lib/Parser/prescan.cpp @@ -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(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); } diff --git a/flang/lib/Parser/prescan.h b/flang/lib/Parser/prescan.h index a64df5377e7e03..9d4f7c0c302a1a 100644 --- a/flang/lib/Parser/prescan.h +++ b/flang/lib/Parser/prescan.h @@ -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; diff --git a/flang/module/__fortran_builtins.f90 b/flang/module/__fortran_builtins.f90 index a9d3ac897eb583..d1d4a639e70d72 100644 --- a/flang/module/__fortran_builtins.f90 +++ b/flang/module/__fortran_builtins.f90 @@ -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 diff --git a/flang/module/__fortran_ieee_exceptions.f90 b/flang/module/__fortran_ieee_exceptions.f90 index cebd6045201812..6691012eda238a 100644 --- a/flang/module/__fortran_ieee_exceptions.f90 +++ b/flang/module/__fortran_ieee_exceptions.f90 @@ -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: & diff --git a/flang/module/ieee_arithmetic.f90 b/flang/module/ieee_arithmetic.f90 index 32e640b9e24574..7eaa7db55af9f8 100644 --- a/flang/module/ieee_arithmetic.f90 +++ b/flang/module/ieee_arithmetic.f90 @@ -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: diff --git a/flang/module/iso_fortran_env.f90 b/flang/module/iso_fortran_env.f90 index cc1f58e7feccb5..4e575b422c2a04 100644 --- a/flang/module/iso_fortran_env.f90 +++ b/flang/module/iso_fortran_env.f90 @@ -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 diff --git a/flang/test/Driver/include-header.f90 b/flang/test/Driver/include-header.f90 index 789d99526d3620..28b75e072544e4 100644 --- a/flang/test/Driver/include-header.f90 +++ b/flang/test/Driver/include-header.f90 @@ -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 diff --git a/flang/test/Preprocessing/include-file.h b/flang/test/Preprocessing/include-file.h new file mode 100644 index 00000000000000..4d4404e75e0e3b --- /dev/null +++ b/flang/test/Preprocessing/include-file.h @@ -0,0 +1 @@ +print *, sin(0.), j diff --git a/flang/test/Preprocessing/include-line.F90 b/flang/test/Preprocessing/include-line.F90 new file mode 100644 index 00000000000000..63ff9d33b07b40 --- /dev/null +++ b/flang/test/Preprocessing/include-line.F90 @@ -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