[cfe-commits] r39348 - in /cfe/cfe/trunk: Parse/ParseExpr.cpp clang.xcodeproj/project.pbxproj include/clang/Basic/DiagnosticKinds.def include/clang/Parse/Parser.h
snaroff at cs.uiuc.edu
snaroff at cs.uiuc.edu
Wed Jul 11 09:43:26 PDT 2007
Author: snaroff
Date: Wed Jul 11 11:43:26 2007
New Revision: 39348
URL: http://llvm.org/viewvc/llvm-project?rev=39348&view=rev
Log:
Bug #:
Submitted by:
Reviewed by:
First phase of parsing IntegerConstants. At the moment, all processing
is done in the Parser, not Sema. If necessary, this is easy to move.
Next steps:
- Convert well for strings to actual values (need to look @ APInt.h)
- Design the API between the Parser and Sema. Sema shouldn't have to be
concerned with any parsing issues...
Modified:
cfe/cfe/trunk/Parse/ParseExpr.cpp
cfe/cfe/trunk/clang.xcodeproj/project.pbxproj
cfe/cfe/trunk/include/clang/Basic/DiagnosticKinds.def
cfe/cfe/trunk/include/clang/Parse/Parser.h
Modified: cfe/cfe/trunk/Parse/ParseExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Parse/ParseExpr.cpp?rev=39348&r1=39347&r2=39348&view=diff
==============================================================================
--- cfe/cfe/trunk/Parse/ParseExpr.cpp (original)
+++ cfe/cfe/trunk/Parse/ParseExpr.cpp Wed Jul 11 11:43:26 2007
@@ -473,13 +473,7 @@
// constant: integer-constant
// constant: floating-constant
- // TODO: Validate whether this is an integer or floating-constant or
- // neither.
- if (1) {
- Res = Actions.ParseIntegerLiteral(Tok.getLocation());
- } else {
- Res = Actions.ParseFloatingLiteral(Tok.getLocation());
- }
+ ParseNumericConstant();
ConsumeToken();
// These can be followed by postfix-expr pieces.
@@ -931,3 +925,114 @@
// Pass the set of string tokens, ready for concatenation, to the actions.
return Actions.ParseStringLiteral(&StringToks[0], StringToks.size());
}
+
+/// integer-constant: [C99 6.4.4.1]
+/// decimal-constant integer-suffix
+/// octal-constant integer-suffix
+/// hexidecimal-constant integer-suffix
+/// decimal-constant:
+/// nonzero-digit
+/// decimal-constant digit
+/// octal-constant:
+/// 0
+/// octal-constant octal-digit
+/// hexidecimal-constant:
+/// hexidecimal-prefix hexidecimal-digit
+/// hexidecimal-constant hexidecimal-digit
+/// hexidecimal-prefix: one of
+/// 0x 0X
+/// integer-suffix:
+/// unsigned-suffix [long-suffix]
+/// unsigned-suffix [long-long-suffix]
+/// long-suffix [unsigned-suffix]
+/// long-long-suffix [unsigned-sufix]
+/// nonzero-digit:
+/// 1 2 3 4 5 6 7 8 9
+/// octal-digit:
+/// 0 1 2 3 4 5 6 7
+/// hexadecimal-digit:
+/// 0 1 2 3 4 5 6 7 8 9
+/// a b c d e f
+/// A B C D E F
+/// unsigned-suffix: one of
+/// u U
+/// long-suffix: one of
+/// l L
+/// long-long-suffix: one of
+/// ll LL
+///
+/// floating-constant: [C99 6.4.4.2]
+///
+Parser::ExprResult Parser::ParseNumericConstant() {
+ SmallString<512> IntegerBuffer;
+ IntegerBuffer.resize(Tok.getLength());
+ const char *ThisTokBegin = &IntegerBuffer[0];
+
+ // Get the spelling of the token, which eliminates trigraphs, etc. Notes:
+ // - We know that ThisTokBuf points to a buffer that is big enough for the
+ // whole token and 'spelled' tokens can only shrink.
+ // - In practice, the local buffer is only used when the spelling doesn't
+ // match the original token (which is rare). The common case simply returns
+ // a pointer to a *constant* buffer (avoiding a copy).
+
+ unsigned ActualLength = PP.getSpelling(Tok, ThisTokBegin);
+ ExprResult Res;
+
+ if (ActualLength == 1) {
+ // need to change interface...just a placeholder
+ Res = Actions.ParseIntegerLiteral(Tok.getLocation());
+ } else if (ActualLength > 1) {
+ const char *ThisTokEnd = ThisTokBegin+ActualLength;
+ const char *s = ThisTokBegin;
+ unsigned int radix;
+
+ if (*s == '0') { // parse radix
+ s++;
+ if (*s == 'x' || *s == 'X') {
+ s++;
+ radix = 16;
+ while (s < ThisTokEnd && isxdigit(*s)) *s++;
+ } else {
+ radix = 8;
+ while (s < ThisTokEnd && ((*s >= '0') && (*s <= '7'))) *s++;
+ }
+ } else { // the first digit is non-zero
+ radix = 10;
+ while (s < ThisTokEnd && isdigit(*s)) *s++;
+ }
+
+ if (*s == '.') { // TODO: Parse Floats...
+ Res = Actions.ParseFloatingLiteral(Tok.getLocation());
+ } else {
+ int unsigned_cnt = 0, long_cnt = 0, invalid_suffix = 0;
+
+ // if there is no suffix, this loop won't be executed (s == ThisTokEnd)
+ while (s < ThisTokEnd && !invalid_suffix) {
+ // parse type suffix - they can appear in any order "ul", "lu", "llu"
+ if (*s == 'u' || *s == 'U') {
+ unsigned_cnt++;
+ if (unsigned_cnt == 2)
+ invalid_suffix = 1;
+ else
+ s++;
+ } else if (*s == 'l' || *s == 'L') {
+ long_cnt++;
+ // l's need to be adjacent and the same case
+ if ((long_cnt == 2 && (*s != *(s-1))) || long_cnt == 3)
+ invalid_suffix = 1;
+ else
+ s++;
+ } else {
+ invalid_suffix = 1;
+ }
+ }
+ if (invalid_suffix) {
+ Diag(Tok, diag::err_invalid_suffix_integer_constant);
+ return ExprResult(true);
+ } else {
+ // need to change interface...just a placeholder
+ Res = Actions.ParseIntegerLiteral(Tok.getLocation());
+ }
+ }
+ }
+}
Modified: cfe/cfe/trunk/clang.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/clang.xcodeproj/project.pbxproj?rev=39348&r1=39347&r2=39348&view=diff
==============================================================================
--- cfe/cfe/trunk/clang.xcodeproj/project.pbxproj (original)
+++ cfe/cfe/trunk/clang.xcodeproj/project.pbxproj Wed Jul 11 11:43:26 2007
@@ -94,6 +94,23 @@
DED7D9E50A5257F6003AD0FB /* ScratchBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DED7D9E40A5257F6003AD0FB /* ScratchBuffer.cpp */; };
/* End PBXBuildFile section */
+/* Begin PBXBuildStyle section */
+ 842065AF0B98D65200CA7A69 /* Development */ = {
+ isa = PBXBuildStyle;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ };
+ name = Development;
+ };
+ 842065B00B98D65200CA7A69 /* Deployment */ = {
+ isa = PBXBuildStyle;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ };
+ name = Deployment;
+ };
+/* End PBXBuildStyle section */
+
/* Begin PBXCopyFilesBuildPhase section */
8DD76F690486A84900D96B5E /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
@@ -476,12 +493,15 @@
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */;
- compatibilityVersion = "Xcode 2.4";
+ buildSettings = {
+ };
+ buildStyles = (
+ 842065AF0B98D65200CA7A69 /* Development */,
+ 842065B00B98D65200CA7A69 /* Deployment */,
+ );
hasScannedForEncodings = 1;
mainGroup = 08FB7794FE84155DC02AAC07 /* clang */;
projectDirPath = "";
- projectRoot = "";
- shouldCheckCompatibility = 1;
targets = (
8DD76F620486A84900D96B5E /* clang */,
);
Modified: cfe/cfe/trunk/include/clang/Basic/DiagnosticKinds.def
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/include/clang/Basic/DiagnosticKinds.def?rev=39348&r1=39347&r2=39348&view=diff
==============================================================================
--- cfe/cfe/trunk/include/clang/Basic/DiagnosticKinds.def (original)
+++ cfe/cfe/trunk/include/clang/Basic/DiagnosticKinds.def Wed Jul 11 11:43:26 2007
@@ -470,6 +470,8 @@
"invalid application of 'sizeof' to an incomplete type '%s'")
DIAG(err_alignof_incomplete_type, ERROR,
"invalid application of '__alignof' to an incomplete type '%s'")
+DIAG(err_invalid_suffix_integer_constant, ERROR,
+ "invalid suffix on integer constant")
// Statements.
DIAG(err_continue_not_in_loop, ERROR,
Modified: cfe/cfe/trunk/include/clang/Parse/Parser.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/include/clang/Parse/Parser.h?rev=39348&r1=39347&r2=39348&view=diff
==============================================================================
--- cfe/cfe/trunk/include/clang/Parse/Parser.h (original)
+++ cfe/cfe/trunk/include/clang/Parse/Parser.h Wed Jul 11 11:43:26 2007
@@ -291,6 +291,7 @@
return ParseParenExpression(Op, CastTy, RParenLoc);
}
ExprResult ParseStringLiteralExpression();
+ ExprResult ParseNumericConstant();
//===--------------------------------------------------------------------===//
// C++ 5.2p1: C++ Casts
More information about the cfe-commits
mailing list