15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- LiteralSupport.h ---------------------------------------*- C++ -*-===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file defines the NumericLiteralParser, CharLiteralParser, and 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StringLiteralParser interfaces. 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef CLANG_LITERALSUPPORT_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define CLANG_LITERALSUPPORT_H 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 183f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose#include "clang/Basic/CharInfo.h" 19686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h" 2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/TokenKinds.h" 2194c939dc1d4958b62ea5a89294dd8b2905f3191fJohn McCall#include "llvm/ADT/APFloat.h" 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/SmallString.h" 23fc97ea29b1afd9e87341bce2b0cbb0c7172b7dd8Dmitri Gribenko#include "llvm/ADT/StringRef.h" 2403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/DataTypes.h" 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 28d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikieclass DiagnosticsEngine; 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Preprocessor; 30d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnerclass Token; 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SourceLocation; 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass TargetInfo; 33ca1475ea0e76da6b852796610139ed9b49c8d4a6Chris Lattnerclass SourceManager; 34ca1475ea0e76da6b852796610139ed9b49c8d4a6Chris Lattnerclass LangOptions; 351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// NumericLiteralParser - This performs strict semantic analysis of the content 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// of a ppnumber, classifying it as either integer, floating, or erroneous, 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// determines the radix of the value and can convert it to a useful value. 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass NumericLiteralParser { 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Preprocessor &PP; // needed for diagnostics 411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *const ThisTokBegin; 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *const ThisTokEnd; 445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *DigitsBegin, *SuffixBegin; // markers 455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *s; // cursor 461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned radix; 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith bool saw_exponent, saw_period, saw_ud_suffix; 501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 52fc97ea29b1afd9e87341bce2b0cbb0c7172b7dd8Dmitri Gribenko NumericLiteralParser(StringRef TokSpelling, 53fc97ea29b1afd9e87341bce2b0cbb0c7172b7dd8Dmitri Gribenko SourceLocation TokLoc, 54fc97ea29b1afd9e87341bce2b0cbb0c7172b7dd8Dmitri Gribenko Preprocessor &PP); 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool hadError; 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isUnsigned; 57506b8dec4ed3db3c60bf9e0dd37901f0cf3d6749Chris Lattner bool isLong; // This is *not* set for long long. 585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isLongLong; 596e400c286b485e28d04a742ea87860ddfefa672eChris Lattner bool isFloat; // 1.0f 60506b8dec4ed3db3c60bf9e0dd37901f0cf3d6749Chris Lattner bool isImaginary; // 1.0i 61b79fe2d28777652a4df4f49dc876cbec060ca90eMike Stump bool isMicrosoftInteger; // Microsoft suffix extension i8, i16, i32, or i64. 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isIntegerLiteral() const { 64506b8dec4ed3db3c60bf9e0dd37901f0cf3d6749Chris Lattner return !saw_period && !saw_exponent; 655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isFloatingLiteral() const { 67506b8dec4ed3db3c60bf9e0dd37901f0cf3d6749Chris Lattner return saw_period || saw_exponent; 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 69b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith 70b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith bool hasUDSuffix() const { 71b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith return saw_ud_suffix; 72b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith } 73b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith StringRef getUDSuffix() const { 74b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith assert(saw_ud_suffix); 75b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith return StringRef(SuffixBegin, ThisTokEnd - SuffixBegin); 76b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith } 77b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith unsigned getUDSuffixOffset() const { 78b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith assert(saw_ud_suffix); 79b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith return SuffixBegin - ThisTokBegin; 805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 824ac537b0f07f2efb9fcf081f60d54e6cfb1cf2d5Richard Smith static bool isValidUDSuffix(const LangOptions &LangOpts, StringRef Suffix); 834ac537b0f07f2efb9fcf081f60d54e6cfb1cf2d5Richard Smith 845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getRadix() const { return radix; } 851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// GetIntegerValue - Convert this numeric literal value to an APInt that 875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// matches Val's input width. If there is an overflow (i.e., if the unsigned 885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// value read is larger than the APInt's bits will hold), set Val to the low 895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// bits of the result and return true. Otherwise, return false. 905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool GetIntegerValue(llvm::APInt &Val); 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 92525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner /// GetFloatValue - Convert this numeric literal to a floating value, using 93525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner /// the specified APFloat fltSemantics (specifying float, double, etc). 94427d5af5b601985093b6b4b33ba1e30fc24d86dcTed Kremenek /// The optional bool isExact (passed-by-reference) has its value 95427d5af5b601985093b6b4b33ba1e30fc24d86dcTed Kremenek /// set to true if the returned APFloat can represent the number in the 96427d5af5b601985093b6b4b33ba1e30fc24d86dcTed Kremenek /// literal exactly, and false otherwise. 9794c939dc1d4958b62ea5a89294dd8b2905f3191fJohn McCall llvm::APFloat::opStatus GetFloatValue(llvm::APFloat &Result); 985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpprivate: 1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 101368328c88bd46f471bbf85f05438b4f2eb95df5bChris Lattner void ParseNumberStartingWithZero(SourceLocation TokLoc); 1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// SkipHexDigits - Read and skip over any hex digits, up to End. 1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Return a pointer to the first non-hex digit or End. 1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *SkipHexDigits(const char *ptr) { 1063f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose while (ptr != ThisTokEnd && isHexDigit(*ptr)) 1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ptr++; 1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return ptr; 1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// SkipOctalDigits - Read and skip over any octal digits, up to End. 1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Return a pointer to the first non-hex digit or End. 1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *SkipOctalDigits(const char *ptr) { 1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer while (ptr != ThisTokEnd && ((*ptr >= '0') && (*ptr <= '7'))) 1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ptr++; 1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return ptr; 1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// SkipDigits - Read and skip over any digits, up to End. 1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Return a pointer to the first non-hex digit or End. 1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *SkipDigits(const char *ptr) { 1223f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose while (ptr != ThisTokEnd && isDigit(*ptr)) 1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ptr++; 1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return ptr; 1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// SkipBinaryDigits - Read and skip over any binary digits, up to End. 1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Return a pointer to the first non-binary digit or End. 1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *SkipBinaryDigits(const char *ptr) { 1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer while (ptr != ThisTokEnd && (*ptr == '0' || *ptr == '1')) 1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ptr++; 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return ptr; 1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CharLiteralParser - Perform interpretation and semantic analysis of a 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// character literal. 1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CharLiteralParser { 1404bc11af9bed1d4a247e3db1fcb754d410ad99099Sanjiv Gupta uint64_t Value; 1415cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor tok::TokenKind Kind; 1422a1c363f38e59a5044fc349aa7e538a50954c244Eli Friedman bool IsMultiChar; 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool HadError; 1445cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith SmallString<32> UDSuffixBuf; 145dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith unsigned UDSuffixOffset; 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer CharLiteralParser(const char *begin, const char *end, 1485cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor SourceLocation Loc, Preprocessor &PP, 1495cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor tok::TokenKind kind); 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool hadError() const { return HadError; } 1525cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor bool isAscii() const { return Kind == tok::char_constant; } 1535cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor bool isWide() const { return Kind == tok::wide_char_constant; } 1545cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor bool isUTF16() const { return Kind == tok::utf16_char_constant; } 1555cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor bool isUTF32() const { return Kind == tok::utf32_char_constant; } 1562a1c363f38e59a5044fc349aa7e538a50954c244Eli Friedman bool isMultiChar() const { return IsMultiChar; } 1574bc11af9bed1d4a247e3db1fcb754d410ad99099Sanjiv Gupta uint64_t getValue() const { return Value; } 1585cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith StringRef getUDSuffix() const { return UDSuffixBuf; } 159dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith unsigned getUDSuffixOffset() const { 160dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith assert(!UDSuffixBuf.empty() && "no ud-suffix"); 161dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith return UDSuffixOffset; 162dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith } 1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// StringLiteralParser - This decodes string escape characters and performs 1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// wide string analysis and Translation Phase #6 (concatenation of string 1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// literals) (C99 5.1.1.2p1). 1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass StringLiteralParser { 1696c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner const SourceManager &SM; 1706c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner const LangOptions &Features; 1716c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner const TargetInfo &Target; 172d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine *Diags; 1736c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner 1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned MaxTokenLength; 1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned SizeBound; 1765cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor unsigned CharByteWidth; 1775cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor tok::TokenKind Kind; 178f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<512> ResultBuf; 1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer char *ResultPtr; // cursor 1805cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith SmallString<32> UDSuffixBuf; 181dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith unsigned UDSuffixToken; 182dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith unsigned UDSuffixOffset; 1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 184d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner StringLiteralParser(const Token *StringToks, unsigned NumStringToks, 185b90f4b3fb94056609da9cca5eef7358d95a363b2Douglas Gregor Preprocessor &PP, bool Complain = true); 1860833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner StringLiteralParser(const Token *StringToks, unsigned NumStringToks, 1870833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner const SourceManager &sm, const LangOptions &features, 188d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie const TargetInfo &target, DiagnosticsEngine *diags = 0) 189403de3f932b5d1d3e4e58f69960000911d04dd2aArgyrios Kyrtzidis : SM(sm), Features(features), Target(target), Diags(diags), 1905cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor MaxTokenLength(0), SizeBound(0), CharByteWidth(0), Kind(tok::unknown), 1915cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor ResultPtr(ResultBuf.data()), hadError(false), Pascal(false) { 1920833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner init(StringToks, NumStringToks); 1930833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner } 1940833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner 1950833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool hadError; 197ee98ac5a1330db432b188dd2d38b6631aac47bf1Anders Carlsson bool Pascal; 1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 199686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef GetString() const { 200686775deca8b8685eb90801495880e3abdd844c2Chris Lattner return StringRef(ResultBuf.data(), GetStringLength()); 20165aa6885818d4b4eea2e5a9d12085b2398148662Jay Foad } 202403de3f932b5d1d3e4e58f69960000911d04dd2aArgyrios Kyrtzidis unsigned GetStringLength() const { return ResultPtr-ResultBuf.data(); } 203dbb1ecc32ca122b07b7c98fd0a8f6f53985adaccChris Lattner 204dbb1ecc32ca122b07b7c98fd0a8f6f53985adaccChris Lattner unsigned GetNumStringChars() const { 2055cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return GetStringLength() / CharByteWidth; 2061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 207719e61573f27c11057ecfe0dd8f141621602c571Chris Lattner /// getOffsetOfStringByte - This function returns the offset of the 208719e61573f27c11057ecfe0dd8f141621602c571Chris Lattner /// specified byte of the string data represented by Token. This handles 209719e61573f27c11057ecfe0dd8f141621602c571Chris Lattner /// advancing over escape sequences in the string. 21091f54ce93bec136fb9e18740b895cf1c1339524bChris Lattner /// 21191f54ce93bec136fb9e18740b895cf1c1339524bChris Lattner /// If the Diagnostics pointer is non-null, then this will do semantic 21291f54ce93bec136fb9e18740b895cf1c1339524bChris Lattner /// checking of the string literal and emit errors and warnings. 2136c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner unsigned getOffsetOfStringByte(const Token &TheTok, unsigned ByteNo) const; 2145cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 21564f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman bool isAscii() const { return Kind == tok::string_literal; } 21664f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman bool isWide() const { return Kind == tok::wide_string_literal; } 21764f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman bool isUTF8() const { return Kind == tok::utf8_string_literal; } 21864f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman bool isUTF16() const { return Kind == tok::utf16_string_literal; } 21964f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman bool isUTF32() const { return Kind == tok::utf32_string_literal; } 22064f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman bool isPascal() const { return Pascal; } 2215cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 2225cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith StringRef getUDSuffix() const { return UDSuffixBuf; } 2235cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith 224dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith /// Get the index of a token containing a ud-suffix. 225dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith unsigned getUDSuffixToken() const { 226dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith assert(!UDSuffixBuf.empty() && "no ud-suffix"); 227dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith return UDSuffixToken; 228dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith } 229dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith /// Get the spelling offset of the first byte of the ud-suffix. 230dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith unsigned getUDSuffixOffset() const { 231dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith assert(!UDSuffixBuf.empty() && "no ud-suffix"); 232dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith return UDSuffixOffset; 233dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith } 234dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith 2350833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattnerprivate: 2360833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner void init(const Token *StringToks, unsigned NumStringToks); 237e5f0588840b20897631cc8110344fd2745ef4caaRichard Smith bool CopyStringFragment(const Token &Tok, const char *TokBegin, 238e5f0588840b20897631cc8110344fd2745ef4caaRichard Smith StringRef Fragment); 2393144749f8bf9bbf7c027f2161a930bff80ad6f72Argyrios Kyrtzidis void DiagnoseLexingError(SourceLocation Loc); 2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2446fa5f0943a84233b2e1ec9716eae55643225bfd4Chris Lattner#endif 245