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 {
21f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  BCPLComment = (1 << 0),
22b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  C89 = (1 << 1),
23b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  C99 = (1 << 2),
24ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer  C11 = (1 << 3),
25b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  CPlusPlus = (1 << 4),
26b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  CPlusPlus0x = (1 << 5),
27b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  Digraphs = (1 << 6),
28b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  GNUMode = (1 << 7),
29b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  HexFloat = (1 << 8),
30b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  ImplicitInt = (1 << 9)
31f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar};
32f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
33f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar}
34f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
35f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar/// LangStandard - Information about the properties of a particular language
36f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar/// standard.
37f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbarstruct LangStandard {
38f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  enum Kind {
39f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar#define LANGSTANDARD(id, name, desc, features) \
40f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar    lang_##id,
41f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar#include "clang/Frontend/LangStandards.def"
42f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar    lang_unspecified
43f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  };
44f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
45f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  const char *ShortName;
46f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  const char *Description;
47f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  unsigned Flags;
48f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
49f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbarpublic:
50fb435102b1632cc0ea8ebdef66099aff082b7d63Daniel Dunbar  /// getName - Get the name of this standard.
51fb435102b1632cc0ea8ebdef66099aff082b7d63Daniel Dunbar  const char *getName() const { return ShortName; }
52fb435102b1632cc0ea8ebdef66099aff082b7d63Daniel Dunbar
53fb435102b1632cc0ea8ebdef66099aff082b7d63Daniel Dunbar  /// getDescription - Get the description of this standard.
54fb435102b1632cc0ea8ebdef66099aff082b7d63Daniel Dunbar  const char *getDescription() const { return Description; }
55fb435102b1632cc0ea8ebdef66099aff082b7d63Daniel Dunbar
56f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  /// hasBCPLComments - Language supports '//' comments.
57f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  bool hasBCPLComments() const { return Flags & frontend::BCPLComment; }
58f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
59b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  /// isC89 - Language is a superset of C89.
60b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier  bool isC89() const { return Flags & frontend::C89; }
61b2dba4bc0eee144baa60e36599a0887496d1295eChad Rosier
62f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  /// isC99 - Language is a superset of C99.
63f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  bool isC99() const { return Flags & frontend::C99; }
64f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
65ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer  /// isC11 - Language is a superset of C11.
66ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer  bool isC11() const { return Flags & frontend::C11; }
677e7fbd05a5dfdb0addfc8b5af2fcbed8c7b5fb87Peter Collingbourne
68f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  /// isCPlusPlus - Language is a C++ variant.
69f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  bool isCPlusPlus() const { return Flags & frontend::CPlusPlus; }
70f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
71f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  /// isCPlusPlus0x - Language is a C++0x variant.
72f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  bool isCPlusPlus0x() const { return Flags & frontend::CPlusPlus0x; }
73f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
7483d5a2a7d5f933cfdba756e76b6c5cc2f61ac37eDaniel Dunbar  /// hasDigraphs - Language supports digraphs.
75f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  bool hasDigraphs() const { return Flags & frontend::Digraphs; }
76f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
77f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  /// isGNUMode - Language includes GNU extensions.
78f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  bool isGNUMode() const { return Flags & frontend::GNUMode; }
79f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
80f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  /// hasHexFloats - Language supports hexadecimal float constants.
81f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  bool hasHexFloats() const { return Flags & frontend::HexFloat; }
82f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
83f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  /// hasImplicitInt - Language allows variables to be typed as int implicitly.
84f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  bool hasImplicitInt() const { return Flags & frontend::ImplicitInt; }
85f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
86f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar  static const LangStandard &getLangStandardForKind(Kind K);
87686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  static const LangStandard *getLangStandardForName(StringRef Name);
88f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar};
89f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
90f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar}  // end namespace clang
91f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar
92f51ac1b3d0fd39853ba6c04e81149acbca6eead4Daniel Dunbar#endif
93