1//===--- LangStandard.h -----------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CLANG_FRONTEND_LANGSTANDARD_H
11#define LLVM_CLANG_FRONTEND_LANGSTANDARD_H
12
13#include "clang/Basic/LLVM.h"
14#include "llvm/ADT/StringRef.h"
15
16namespace clang {
17
18namespace frontend {
19
20enum LangFeatures {
21  LineComment = (1 << 0),
22  C89 = (1 << 1),
23  C99 = (1 << 2),
24  C11 = (1 << 3),
25  CPlusPlus = (1 << 4),
26  CPlusPlus11 = (1 << 5),
27  CPlusPlus14 = (1 << 6),
28  CPlusPlus1z = (1 << 7),
29  Digraphs = (1 << 8),
30  GNUMode = (1 << 9),
31  HexFloat = (1 << 10),
32  ImplicitInt = (1 << 11)
33};
34
35}
36
37/// LangStandard - Information about the properties of a particular language
38/// standard.
39struct LangStandard {
40  enum Kind {
41#define LANGSTANDARD(id, name, desc, features) \
42    lang_##id,
43#include "clang/Frontend/LangStandards.def"
44    lang_unspecified
45  };
46
47  const char *ShortName;
48  const char *Description;
49  unsigned Flags;
50
51public:
52  /// getName - Get the name of this standard.
53  const char *getName() const { return ShortName; }
54
55  /// getDescription - Get the description of this standard.
56  const char *getDescription() const { return Description; }
57
58  /// Language supports '//' comments.
59  bool hasLineComments() const { return Flags & frontend::LineComment; }
60
61  /// isC89 - Language is a superset of C89.
62  bool isC89() const { return Flags & frontend::C89; }
63
64  /// isC99 - Language is a superset of C99.
65  bool isC99() const { return Flags & frontend::C99; }
66
67  /// isC11 - Language is a superset of C11.
68  bool isC11() const { return Flags & frontend::C11; }
69
70  /// isCPlusPlus - Language is a C++ variant.
71  bool isCPlusPlus() const { return Flags & frontend::CPlusPlus; }
72
73  /// isCPlusPlus11 - Language is a C++11 variant (or later).
74  bool isCPlusPlus11() const { return Flags & frontend::CPlusPlus11; }
75
76  /// isCPlusPlus14 - Language is a C++14 variant (or later).
77  bool isCPlusPlus14() const { return Flags & frontend::CPlusPlus14; }
78
79  /// isCPlusPlus1z - Language is a C++17 variant (or later).
80  bool isCPlusPlus1z() const { return Flags & frontend::CPlusPlus1z; }
81
82  /// hasDigraphs - Language supports digraphs.
83  bool hasDigraphs() const { return Flags & frontend::Digraphs; }
84
85  /// isGNUMode - Language includes GNU extensions.
86  bool isGNUMode() const { return Flags & frontend::GNUMode; }
87
88  /// hasHexFloats - Language supports hexadecimal float constants.
89  bool hasHexFloats() const { return Flags & frontend::HexFloat; }
90
91  /// hasImplicitInt - Language allows variables to be typed as int implicitly.
92  bool hasImplicitInt() const { return Flags & frontend::ImplicitInt; }
93
94  static const LangStandard &getLangStandardForKind(Kind K);
95  static const LangStandard *getLangStandardForName(StringRef Name);
96};
97
98}  // end namespace clang
99
100#endif
101