Clang Project

clang_source_code/include/clang/Frontend/LangStandard.h
1//===--- LangStandard.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 LLVM_CLANG_FRONTEND_LANGSTANDARD_H
10#define LLVM_CLANG_FRONTEND_LANGSTANDARD_H
11
12#include "clang/Basic/LLVM.h"
13#include "clang/Frontend/FrontendOptions.h"
14#include "llvm/ADT/StringRef.h"
15
16namespace clang {
17
18namespace frontend {
19
20enum LangFeatures {
21  LineComment = (1 << 0),
22  C99 = (1 << 1),
23  C11 = (1 << 2),
24  C17 = (1 << 3),
25  CPlusPlus = (1 << 4),
26  CPlusPlus11 = (1 << 5),
27  CPlusPlus14 = (1 << 6),
28  CPlusPlus17 = (1 << 7),
29  CPlusPlus2a = (1 << 8),
30  Digraphs = (1 << 9),
31  GNUMode = (1 << 10),
32  HexFloat = (1 << 11),
33  ImplicitInt = (1 << 12),
34  OpenCL = (1 << 13)
35};
36
37}
38
39/// LangStandard - Information about the properties of a particular language
40/// standard.
41struct LangStandard {
42  enum Kind {
43#define LANGSTANDARD(id, name, lang, desc, features) \
44    lang_##id,
45#include "clang/Frontend/LangStandards.def"
46    lang_unspecified
47  };
48
49  const char *ShortName;
50  const char *Description;
51  unsigned Flags;
52  InputKind::Language Language;
53
54public:
55  /// getName - Get the name of this standard.
56  const char *getName() const { return ShortName; }
57
58  /// getDescription - Get the description of this standard.
59  const char *getDescription() const { return Description; }
60
61  /// Get the language that this standard describes.
62  InputKind::Language getLanguage() const { return Language; }
63
64  /// Language supports '//' comments.
65  bool hasLineComments() const { return Flags & frontend::LineComment; }
66
67  /// isC99 - Language is a superset of C99.
68  bool isC99() const { return Flags & frontend::C99; }
69
70  /// isC11 - Language is a superset of C11.
71  bool isC11() const { return Flags & frontend::C11; }
72
73  /// isC17 - Language is a superset of C17.
74  bool isC17() const { return Flags & frontend::C17; }
75
76  /// isCPlusPlus - Language is a C++ variant.
77  bool isCPlusPlus() const { return Flags & frontend::CPlusPlus; }
78
79  /// isCPlusPlus11 - Language is a C++11 variant (or later).
80  bool isCPlusPlus11() const { return Flags & frontend::CPlusPlus11; }
81
82  /// isCPlusPlus14 - Language is a C++14 variant (or later).
83  bool isCPlusPlus14() const { return Flags & frontend::CPlusPlus14; }
84
85  /// isCPlusPlus17 - Language is a C++17 variant (or later).
86  bool isCPlusPlus17() const { return Flags & frontend::CPlusPlus17; }
87
88  /// isCPlusPlus2a - Language is a post-C++17 variant (or later).
89  bool isCPlusPlus2a() const { return Flags & frontend::CPlusPlus2a; }
90
91
92  /// hasDigraphs - Language supports digraphs.
93  bool hasDigraphs() const { return Flags & frontend::Digraphs; }
94
95  /// isGNUMode - Language includes GNU extensions.
96  bool isGNUMode() const { return Flags & frontend::GNUMode; }
97
98  /// hasHexFloats - Language supports hexadecimal float constants.
99  bool hasHexFloats() const { return Flags & frontend::HexFloat; }
100
101  /// hasImplicitInt - Language allows variables to be typed as int implicitly.
102  bool hasImplicitInt() const { return Flags & frontend::ImplicitInt; }
103
104  /// isOpenCL - Language is a OpenCL variant.
105  bool isOpenCL() const { return Flags & frontend::OpenCL; }
106
107  static const LangStandard &getLangStandardForKind(Kind K);
108  static const LangStandard *getLangStandardForName(StringRef Name);
109};
110
111}  // end namespace clang
112
113#endif
114
clang::LangStandard::Kind
clang::LangStandard::ShortName
clang::LangStandard::Description
clang::LangStandard::Flags
clang::LangStandard::Language
clang::LangStandard::getName
clang::LangStandard::getDescription
clang::LangStandard::getLanguage
clang::LangStandard::hasLineComments
clang::LangStandard::isC99
clang::LangStandard::isC11
clang::LangStandard::isC17
clang::LangStandard::isCPlusPlus
clang::LangStandard::isCPlusPlus11
clang::LangStandard::isCPlusPlus14
clang::LangStandard::isCPlusPlus17
clang::LangStandard::isCPlusPlus2a
clang::LangStandard::hasDigraphs
clang::LangStandard::isGNUMode
clang::LangStandard::hasHexFloats
clang::LangStandard::hasImplicitInt
clang::LangStandard::isOpenCL
clang::LangStandard::getLangStandardForKind
clang::LangStandard::getLangStandardForName