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