1 //===-- include/flang/Common/Fortran-features.h -----------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef FORTRAN_COMMON_FORTRAN_FEATURES_H_ 10 #define FORTRAN_COMMON_FORTRAN_FEATURES_H_ 11 12 #include "flang/Common/Fortran.h" 13 #include "flang/Common/enum-set.h" 14 #include "flang/Common/idioms.h" 15 16 namespace Fortran::common { 17 18 ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines, 19 FixedFormContinuationWithColumn1Ampersand, LogicalAbbreviations, 20 XOROperator, PunctuationInNames, OptionalFreeFormSpace, BOZExtensions, 21 EmptyStatement, AlternativeNE, ExecutionPartNamelist, DECStructures, 22 DoubleComplex, Byte, StarKind, ExponentMatchingKindParam, QuadPrecision, 23 SlashInitialization, TripletInArrayConstructor, MissingColons, 24 SignedComplexLiteral, OldStyleParameter, ComplexConstructor, PercentLOC, 25 SignedPrimary, FileName, Carriagecontrol, Convert, Dispose, 26 IOListLeadingComma, AbbreviatedEditDescriptor, ProgramParentheses, 27 PercentRefAndVal, OmitFunctionDummies, CrayPointer, Hollerith, ArithmeticIF, 28 Assign, AssignedGOTO, Pause, OpenACC, OpenMP, CruftAfterAmpersand, 29 ClassicCComments, AdditionalFormats, BigIntLiterals, RealDoControls, 30 EquivalenceNumericWithCharacter, EquivalenceNonDefaultNumeric, 31 EquivalenceSameNonSequence, AdditionalIntrinsics, AnonymousParents, 32 OldLabelDoEndStatements, LogicalIntegerAssignment, EmptySourceFile, 33 ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways, 34 ForwardRefDummyImplicitNone, OpenAccessAppend, BOZAsDefaultInteger, 35 DistinguishableSpecifics, DefaultSave, PointerInSeqType, NonCharacterFormat) 36 37 using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>; 38 39 class LanguageFeatureControl { 40 public: LanguageFeatureControl()41 LanguageFeatureControl() { 42 // These features must be explicitly enabled by command line options. 43 disable_.set(LanguageFeature::OldDebugLines); 44 disable_.set(LanguageFeature::OpenACC); 45 disable_.set(LanguageFeature::OpenMP); 46 disable_.set(LanguageFeature::ImplicitNoneTypeNever); 47 disable_.set(LanguageFeature::ImplicitNoneTypeAlways); 48 disable_.set(LanguageFeature::DefaultSave); 49 // These features, if enabled, conflict with valid standard usage, 50 // so there are disabled here by default. 51 disable_.set(LanguageFeature::BackslashEscapes); 52 disable_.set(LanguageFeature::LogicalAbbreviations); 53 disable_.set(LanguageFeature::XOROperator); 54 disable_.set(LanguageFeature::OldStyleParameter); 55 } 56 LanguageFeatureControl(const LanguageFeatureControl &) = default; 57 void Enable(LanguageFeature f, bool yes = true) { disable_.set(f, !yes); } 58 void EnableWarning(LanguageFeature f, bool yes = true) { warn_.set(f, yes); } 59 void WarnOnAllNonstandard(bool yes = true) { warnAll_ = yes; } IsEnabled(LanguageFeature f)60 bool IsEnabled(LanguageFeature f) const { return !disable_.test(f); } ShouldWarn(LanguageFeature f)61 bool ShouldWarn(LanguageFeature f) const { 62 return (warnAll_ && f != LanguageFeature::OpenMP && 63 f != LanguageFeature::OpenACC) || 64 warn_.test(f); 65 } 66 // Return all spellings of operators names, depending on features enabled 67 std::vector<const char *> GetNames(LogicalOperator) const; 68 std::vector<const char *> GetNames(RelationalOperator) const; 69 70 private: 71 LanguageFeatures disable_; 72 LanguageFeatures warn_; 73 bool warnAll_{false}; 74 }; 75 } // namespace Fortran::common 76 #endif // FORTRAN_COMMON_FORTRAN_FEATURES_H_ 77