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