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