1199990Srdivacky//===--- LangStandard.h -----------------------------------------*- C++ -*-===//
2199990Srdivacky//
3199990Srdivacky//                     The LLVM Compiler Infrastructure
4199990Srdivacky//
5199990Srdivacky// This file is distributed under the University of Illinois Open Source
6199990Srdivacky// License. See LICENSE.TXT for details.
7199990Srdivacky//
8199990Srdivacky//===----------------------------------------------------------------------===//
9199990Srdivacky
10199990Srdivacky#ifndef LLVM_CLANG_FRONTEND_LANGSTANDARD_H
11199990Srdivacky#define LLVM_CLANG_FRONTEND_LANGSTANDARD_H
12199990Srdivacky
13226633Sdim#include "clang/Basic/LLVM.h"
14199990Srdivacky#include "llvm/ADT/StringRef.h"
15199990Srdivacky
16199990Srdivackynamespace clang {
17199990Srdivacky
18199990Srdivackynamespace frontend {
19199990Srdivacky
20199990Srdivackyenum LangFeatures {
21243830Sdim  LineComment = (1 << 0),
22223017Sdim  C89 = (1 << 1),
23223017Sdim  C99 = (1 << 2),
24234353Sdim  C11 = (1 << 3),
25223017Sdim  CPlusPlus = (1 << 4),
26249423Sdim  CPlusPlus11 = (1 << 5),
27243830Sdim  CPlusPlus1y = (1 << 6),
28243830Sdim  Digraphs = (1 << 7),
29243830Sdim  GNUMode = (1 << 8),
30243830Sdim  HexFloat = (1 << 9),
31243830Sdim  ImplicitInt = (1 << 10)
32199990Srdivacky};
33199990Srdivacky
34199990Srdivacky}
35199990Srdivacky
36199990Srdivacky/// LangStandard - Information about the properties of a particular language
37199990Srdivacky/// standard.
38199990Srdivackystruct LangStandard {
39199990Srdivacky  enum Kind {
40199990Srdivacky#define LANGSTANDARD(id, name, desc, features) \
41199990Srdivacky    lang_##id,
42199990Srdivacky#include "clang/Frontend/LangStandards.def"
43199990Srdivacky    lang_unspecified
44199990Srdivacky  };
45199990Srdivacky
46199990Srdivacky  const char *ShortName;
47199990Srdivacky  const char *Description;
48199990Srdivacky  unsigned Flags;
49199990Srdivacky
50199990Srdivackypublic:
51199990Srdivacky  /// getName - Get the name of this standard.
52199990Srdivacky  const char *getName() const { return ShortName; }
53199990Srdivacky
54199990Srdivacky  /// getDescription - Get the description of this standard.
55199990Srdivacky  const char *getDescription() const { return Description; }
56199990Srdivacky
57243830Sdim  /// Language supports '//' comments.
58243830Sdim  bool hasLineComments() const { return Flags & frontend::LineComment; }
59199990Srdivacky
60223017Sdim  /// isC89 - Language is a superset of C89.
61223017Sdim  bool isC89() const { return Flags & frontend::C89; }
62223017Sdim
63199990Srdivacky  /// isC99 - Language is a superset of C99.
64199990Srdivacky  bool isC99() const { return Flags & frontend::C99; }
65199990Srdivacky
66234353Sdim  /// isC11 - Language is a superset of C11.
67234353Sdim  bool isC11() const { return Flags & frontend::C11; }
68221345Sdim
69199990Srdivacky  /// isCPlusPlus - Language is a C++ variant.
70199990Srdivacky  bool isCPlusPlus() const { return Flags & frontend::CPlusPlus; }
71199990Srdivacky
72249423Sdim  /// isCPlusPlus11 - Language is a C++0x variant.
73249423Sdim  bool isCPlusPlus11() const { return Flags & frontend::CPlusPlus11; }
74199990Srdivacky
75243830Sdim  /// isCPlusPlus1y - Language is a C++1y variant.
76243830Sdim  bool isCPlusPlus1y() const { return Flags & frontend::CPlusPlus1y; }
77243830Sdim
78199990Srdivacky  /// hasDigraphs - Language supports digraphs.
79199990Srdivacky  bool hasDigraphs() const { return Flags & frontend::Digraphs; }
80199990Srdivacky
81199990Srdivacky  /// isGNUMode - Language includes GNU extensions.
82199990Srdivacky  bool isGNUMode() const { return Flags & frontend::GNUMode; }
83199990Srdivacky
84199990Srdivacky  /// hasHexFloats - Language supports hexadecimal float constants.
85199990Srdivacky  bool hasHexFloats() const { return Flags & frontend::HexFloat; }
86199990Srdivacky
87199990Srdivacky  /// hasImplicitInt - Language allows variables to be typed as int implicitly.
88199990Srdivacky  bool hasImplicitInt() const { return Flags & frontend::ImplicitInt; }
89199990Srdivacky
90199990Srdivacky  static const LangStandard &getLangStandardForKind(Kind K);
91226633Sdim  static const LangStandard *getLangStandardForName(StringRef Name);
92199990Srdivacky};
93199990Srdivacky
94199990Srdivacky}  // end namespace clang
95199990Srdivacky
96199990Srdivacky#endif
97