[cfe-commits] r38805 - in /cfe/cfe/trunk: Parse/Actions.cpp Parse/DeclSpec.cpp Parse/ParseDecl.cpp Parse/Parser.cpp clang.xcodeproj/project.pbxproj include/clang/Basic/DiagnosticKinds.def include/clang/Parse/DeclSpec.h include/clang/Parse/Parser.h
sabre at cs.uiuc.edu
sabre at cs.uiuc.edu
Wed Jul 11 09:24:47 PDT 2007
Author: sabre
Date: Wed Jul 11 11:24:47 2007
New Revision: 38805
URL: http://llvm.org/viewvc/llvm-project?rev=38805&view=rev
Log:
Add an initial cut at a datastructure for holding declspec's.
Added:
cfe/cfe/trunk/Parse/DeclSpec.cpp (with props)
cfe/cfe/trunk/include/clang/Parse/DeclSpec.h (with props)
Modified:
cfe/cfe/trunk/Parse/Actions.cpp
cfe/cfe/trunk/Parse/ParseDecl.cpp
cfe/cfe/trunk/Parse/Parser.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/Actions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Parse/Actions.cpp?rev=38805&r1=38804&r2=38805&view=diff
==============================================================================
--- cfe/cfe/trunk/Parse/Actions.cpp (original)
+++ cfe/cfe/trunk/Parse/Actions.cpp Wed Jul 11 11:24:47 2007
@@ -1,4 +1,4 @@
-//===--- ParserActions.cpp - C Language Family Default Parser Actions -----===//
+//===--- Actions.cpp - C Language Family Default Parser Actions -----------===//
//
// The LLVM Compiler Infrastructure
//
Added: cfe/cfe/trunk/Parse/DeclSpec.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Parse/DeclSpec.cpp?rev=38805&view=auto
==============================================================================
--- cfe/cfe/trunk/Parse/DeclSpec.cpp (added)
+++ cfe/cfe/trunk/Parse/DeclSpec.cpp Wed Jul 11 11:24:47 2007
@@ -0,0 +1,130 @@
+//===--- Declarations.cpp - Declaration Representation Implementation -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Chris Lattner and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the Declaration representation classes.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Parse/Declarations.h"
+using namespace llvm;
+using namespace clang;
+
+/// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
+///
+unsigned DeclSpec::getParsedSpecifiers() const {
+ unsigned Res = 0;
+ if (StorageClassSpec != SCS_unspecified)
+ Res |= PQ_StorageClassSpecifier;
+
+ if (TypeQualifiers != TQ_unspecified)
+ Res |= PQ_TypeQualifier;
+
+ if (TypeSpecWidth != TSW_unspecified ||
+ TypeSpecComplex != TSC_unspecified ||
+ TypeSpecSign != TSS_unspecified ||
+ TypeSpecType != TST_unspecified)
+ Res |= PQ_TypeSpecifier;
+
+ if (FuncSpec != FS_unspecified)
+ Res |= PQ_FunctionSpecifier;
+ return Res;
+}
+
+
+static bool BadSpecifier(DeclSpec::TSW W, const char *&PrevSpec) {
+ switch (W) {
+ case DeclSpec::TSW_unspecified: PrevSpec = "unspecified"; break;
+ case DeclSpec::TSW_short: PrevSpec = "short"; break;
+ case DeclSpec::TSW_long: PrevSpec = "long"; break;
+ case DeclSpec::TSW_longlong: PrevSpec = "long long"; break;
+ }
+ return true;
+}
+
+static bool BadSpecifier(DeclSpec::TSC C, const char *&PrevSpec) {
+ switch (C) {
+ case DeclSpec::TSC_unspecified: PrevSpec = "unspecified"; break;
+ case DeclSpec::TSC_imaginary: PrevSpec = "imaginary"; break;
+ case DeclSpec::TSC_complex: PrevSpec = "complex"; break;
+ }
+ return true;
+}
+
+
+static bool BadSpecifier(DeclSpec::TSS S, const char *&PrevSpec) {
+ switch (S) {
+ case DeclSpec::TSS_unspecified: PrevSpec = "unspecified"; break;
+ case DeclSpec::TSS_signed: PrevSpec = "signed"; break;
+ case DeclSpec::TSS_unsigned: PrevSpec = "unsigned"; break;
+ }
+ return true;
+}
+
+static bool BadSpecifier(DeclSpec::TST T, const char *&PrevSpec) {
+ switch (T) {
+ case DeclSpec::TST_unspecified: PrevSpec = "unspecified"; break;
+ case DeclSpec::TST_void: PrevSpec = "void"; break;
+ case DeclSpec::TST_char: PrevSpec = "char"; break;
+ case DeclSpec::TST_int: PrevSpec = "int"; break;
+ case DeclSpec::TST_float: PrevSpec = "float"; break;
+ case DeclSpec::TST_double: PrevSpec = "double"; break;
+ case DeclSpec::TST_bool: PrevSpec = "_Bool"; break;
+ case DeclSpec::TST_decimal32: PrevSpec = "_Decimal32"; break;
+ case DeclSpec::TST_decimal64: PrevSpec = "_Decimal64"; break;
+ case DeclSpec::TST_decimal128: PrevSpec = "_Decimal128"; break;
+ }
+ return true;
+}
+
+
+/// These methods set the specified attribute of the DeclSpec, but return true
+/// and ignore the request if invalid (e.g. "extern" then "auto" is
+/// specified).
+bool DeclSpec::SetTypeSpecWidth(TSW W, const char *&PrevSpec) {
+ if (TypeSpecWidth != TSW_unspecified)
+ return BadSpecifier(TypeSpecWidth, PrevSpec);
+ TypeSpecWidth = W;
+ return false;
+}
+
+bool DeclSpec::SetTypeSpecComplex(TSC C, const char *&PrevSpec) {
+ if (TypeSpecComplex != TSC_unspecified)
+ return BadSpecifier(TypeSpecComplex, PrevSpec);
+ TypeSpecComplex = C;
+ return false;
+}
+
+bool DeclSpec::SetTypeSpecSign(TSS S, const char *&PrevSpec) {
+ if (TypeSpecSign != TSS_unspecified)
+ return BadSpecifier(TypeSpecSign, PrevSpec);
+ return false;
+}
+
+bool DeclSpec::SetTypeSpecType(TST T, const char *&PrevSpec) {
+ if (TypeSpecType != TST_unspecified)
+ return BadSpecifier(TypeSpecType, PrevSpec);
+ return false;
+}
+
+
+bool DeclSpec::SetFuncSpec(FS F, const char *&PrevSpec) {
+ // 'inline inline' is ok.
+ FuncSpec = F;
+ return false;
+}
+
+/// Finish - This does final analysis of the declspec, rejecting things like
+/// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or
+/// diag::NUM_DIAGNOSTICS if there is no error. After calling this method,
+/// DeclSpec is guaranteed self-consistent, even if an error occurred.
+diag::kind DeclSpec::Finish() {
+ // FIXME: implement this.
+
+ return diag::NUM_DIAGNOSTICS;
+}
Propchange: cfe/cfe/trunk/Parse/DeclSpec.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cfe/cfe/trunk/Parse/DeclSpec.cpp
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: cfe/cfe/trunk/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Parse/ParseDecl.cpp?rev=38805&r1=38804&r2=38805&view=diff
==============================================================================
--- cfe/cfe/trunk/Parse/ParseDecl.cpp (original)
+++ cfe/cfe/trunk/Parse/ParseDecl.cpp Wed Jul 11 11:24:47 2007
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "clang/Parse/Parser.h"
+#include "clang/Parse/Declarations.h"
using namespace llvm;
using namespace clang;
@@ -22,6 +23,7 @@
/// ParseDeclarationSpecifiers
/// declaration-specifiers: [C99 6.7]
/// storage-class-specifier declaration-specifiers [opt] [TODO]
+/// //__thread
/// type-specifier declaration-specifiers [opt]
/// type-qualifier declaration-specifiers [opt] [TODO]
/// [C99] function-specifier declaration-specifiers [opt] [TODO]
@@ -42,35 +44,93 @@
/// struct-or-union-specifier [TODO]
/// enum-specifier [TODO]
/// typedef-name [TODO]
-
-void Parser::ParseDeclarationSpecifiers() {
+/// function-specifier: [C99 6.7.4]
+/// [C99] inline
+///
+void Parser::ParseDeclarationSpecifiers(DeclSpec &DS) {
+ SourceLocation StartLoc = Tok.getLocation();
while (1) {
+ bool isInvalid = false;
+ const char *PrevSpec = 0;
switch (Tok.getKind()) {
- default: return; // Not a declaration specifier token.
+ default:
+ // If this is not a declaration specifier token, we're done reading decl
+ // specifiers. First verify that DeclSpec's are consistent.
+ diag::kind Res = DS.Finish();
+ if (Res != diag::NUM_DIAGNOSTICS)
+ Diag(StartLoc, Res);
+ return;
// type-specifiers
- case tok::kw_void: // SetTypeSpecifier(); break;
+ case tok::kw_short:
+ isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_short, PrevSpec);
+ break;
+ case tok::kw_long:
+ if (DS.TypeSpecWidth != DeclSpec::TSW_long) {
+ isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_long, PrevSpec);
+ } else {
+ DS.TypeSpecWidth = DeclSpec::TSW_unspecified;
+ isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_longlong, PrevSpec);
+ }
+ break;
+ case tok::kw_signed:
+ isInvalid = DS.SetTypeSpecSign(DeclSpec::TSS_signed, PrevSpec);
+ break;
+ case tok::kw_unsigned:
+ isInvalid = DS.SetTypeSpecSign(DeclSpec::TSS_unsigned, PrevSpec);
+ break;
+ case tok::kw__Complex:
+ isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_complex, PrevSpec);
+ break;
+ case tok::kw__Imaginary:
+ isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_imaginary, PrevSpec);
+ break;
+ case tok::kw_void:
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_void, PrevSpec);
+ break;
case tok::kw_char:
- case tok::kw_short: // Width
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char, PrevSpec);
+ break;
case tok::kw_int:
- case tok::kw_long: // Width
- case tok::kw_float: // Type specifier
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_int, PrevSpec);
+ break;
+ case tok::kw_float:
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_float, PrevSpec);
+ break;
case tok::kw_double:
- case tok::kw_signed: // Signedness
- case tok::kw_unsigned: // Signedness
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_double, PrevSpec);
+ break;
case tok::kw__Bool:
- case tok::kw__Complex: // Complexity
- case tok::kw__Imaginary: // Complexity
- // FIXME: Read these, handle them!
- ConsumeToken();
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_bool, PrevSpec);
+ break;
+ case tok::kw__Decimal32:
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal32, PrevSpec);
+ break;
+ case tok::kw__Decimal64:
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal64, PrevSpec);
+ break;
+ case tok::kw__Decimal128:
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal128, PrevSpec);
break;
//case tok::kw_struct:
//case tok::kw_union:
//case tok::kw_enum:
+
+ // function-specifier
+ case tok::kw_inline:
+ isInvalid = DS.SetFuncSpec(DeclSpec::FS_inline, PrevSpec);
+ break;
+ }
+ // If the specifier combination wasn't legal, issue a diagnostic.
+ if (isInvalid) {
+ assert(PrevSpec && "Method did not return previous specifier!");
+ Diag(Tok, diag::err_invalid_decl_spec_combination, PrevSpec);
}
+ ConsumeToken();
}
}
+
/// ParseDeclarator
/// declarator: [C99 6.7.5]
/// pointer[opt] direct-declarator
Modified: cfe/cfe/trunk/Parse/Parser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Parse/Parser.cpp?rev=38805&r1=38804&r2=38805&view=diff
==============================================================================
--- cfe/cfe/trunk/Parse/Parser.cpp (original)
+++ cfe/cfe/trunk/Parse/Parser.cpp Wed Jul 11 11:24:47 2007
@@ -1,4 +1,4 @@
-//===--- Parser.cpp - C Language Family Parser ----------------------------===//
+//===--- Parse.cpp - C Language Family Parser -----------------------------===//
//
// The LLVM Compiler Infrastructure
//
@@ -12,16 +12,16 @@
//===----------------------------------------------------------------------===//
#include "clang/Parse/Parser.h"
-#include "clang/Basic/Diagnostic.h"
+#include "clang/Parse/Declarations.h"
using namespace llvm;
using namespace clang;
Parser::Parser(Preprocessor &pp, ParserActions &actions)
: PP(pp), Actions(actions), Diags(PP.getDiagnostics()) {}
-void Parser::Diag(const LexerToken &Tok, unsigned DiagID,
+void Parser::Diag(SourceLocation Loc, unsigned DiagID,
const std::string &Msg) {
- Diags.Report(Tok.getLocation(), DiagID, Msg);
+ Diags.Report(Loc, DiagID, Msg);
}
//===----------------------------------------------------------------------===//
@@ -89,8 +89,9 @@
///
void Parser::ParseDeclarationOrFunctionDefinition() {
// Parse the common declaration-specifiers piece.
- // NOTE: this can not be missing for C99 declaration's.
- ParseDeclarationSpecifiers();
+ // NOTE: this can not be missing for C99 'declaration's.
+ DeclSpec DS;
+ ParseDeclarationSpecifiers(DS);
// Parse the common declarator piece.
ParseDeclarator();
Modified: cfe/cfe/trunk/clang.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/clang.xcodeproj/project.pbxproj?rev=38805&r1=38804&r2=38805&view=diff
==============================================================================
--- cfe/cfe/trunk/clang.xcodeproj/project.pbxproj (original)
+++ cfe/cfe/trunk/clang.xcodeproj/project.pbxproj Wed Jul 11 11:24:47 2007
@@ -9,8 +9,11 @@
/* Begin PBXBuildFile section */
DE1F22030A7D852A00FBF588 /* Parser.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE1F22020A7D852A00FBF588 /* Parser.h */; };
DE1F22200A7D879000FBF588 /* ParserActions.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE1F221F0A7D879000FBF588 /* ParserActions.h */; };
- DE1F22730A7D8D5800FBF588 /* Parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE1F22710A7D8D5800FBF588 /* Parser.cpp */; };
- DE1F22740A7D8D5800FBF588 /* ParserActions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE1F22720A7D8D5800FBF588 /* ParserActions.cpp */; };
+ DE1F24700A7DC99000FBF588 /* Actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE1F246D0A7DC99000FBF588 /* Actions.cpp */; };
+ DE1F24710A7DC99000FBF588 /* Parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE1F246E0A7DC99000FBF588 /* Parse.cpp */; };
+ DE1F24720A7DC99000FBF588 /* ParseDeclarations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE1F246F0A7DC99000FBF588 /* ParseDeclarations.cpp */; };
+ DE1F24820A7DCD3800FBF588 /* Declarations.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE1F24810A7DCD3800FBF588 /* Declarations.h */; };
+ DE1F257B0A7DD86800FBF588 /* Declarations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE1F257A0A7DD86800FBF588 /* Declarations.cpp */; };
DEAEE98B0A5A2B970045101B /* MultipleIncludeOpt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DEAEE98A0A5A2B970045101B /* MultipleIncludeOpt.h */; };
DEAEECAD0A5AF0E30045101B /* clang.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DEAEECAC0A5AF0E30045101B /* clang.h */; };
DEAEECD50A5AF1FE0045101B /* PrintPreprocessedOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DEAEECD40A5AF1FE0045101B /* PrintPreprocessedOutput.cpp */; };
@@ -92,6 +95,7 @@
DEAEED4B0A5AF89A0045101B /* NOTES.txt in CopyFiles */,
DE1F22030A7D852A00FBF588 /* Parser.h in CopyFiles */,
DE1F22200A7D879000FBF588 /* ParserActions.h in CopyFiles */,
+ DE1F24820A7DCD3800FBF588 /* Declarations.h in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 1;
};
@@ -101,8 +105,11 @@
8DD76F6C0486A84900D96B5E /* clang */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = clang; sourceTree = BUILT_PRODUCTS_DIR; };
DE1F22020A7D852A00FBF588 /* Parser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Parser.h; path = clang/Parse/Parser.h; sourceTree = "<group>"; };
DE1F221F0A7D879000FBF588 /* ParserActions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ParserActions.h; path = clang/Parse/ParserActions.h; sourceTree = "<group>"; };
- DE1F22710A7D8D5800FBF588 /* Parser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Parser.cpp; path = Parse/Parser.cpp; sourceTree = "<group>"; };
- DE1F22720A7D8D5800FBF588 /* ParserActions.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ParserActions.cpp; path = Parse/ParserActions.cpp; sourceTree = "<group>"; };
+ DE1F246D0A7DC99000FBF588 /* Actions.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Actions.cpp; path = Parse/Actions.cpp; sourceTree = "<group>"; };
+ DE1F246E0A7DC99000FBF588 /* Parse.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Parse.cpp; path = Parse/Parse.cpp; sourceTree = "<group>"; };
+ DE1F246F0A7DC99000FBF588 /* ParseDeclarations.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ParseDeclarations.cpp; path = Parse/ParseDeclarations.cpp; sourceTree = "<group>"; };
+ DE1F24810A7DCD3800FBF588 /* Declarations.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Declarations.h; path = clang/Parse/Declarations.h; sourceTree = "<group>"; };
+ DE1F257A0A7DD86800FBF588 /* Declarations.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Declarations.cpp; path = Parse/Declarations.cpp; sourceTree = "<group>"; };
DEAEE98A0A5A2B970045101B /* MultipleIncludeOpt.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MultipleIncludeOpt.h; sourceTree = "<group>"; };
DEAEECAC0A5AF0E30045101B /* clang.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = clang.h; sourceTree = "<group>"; };
DEAEECD40A5AF1FE0045101B /* PrintPreprocessedOutput.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PrintPreprocessedOutput.cpp; sourceTree = "<group>"; };
@@ -193,6 +200,7 @@
DE1F21F20A7D84E800FBF588 /* Parse */ = {
isa = PBXGroup;
children = (
+ DE1F24810A7DCD3800FBF588 /* Declarations.h */,
DE1F22020A7D852A00FBF588 /* Parser.h */,
DE1F221F0A7D879000FBF588 /* ParserActions.h */,
);
@@ -202,8 +210,10 @@
DE1F22600A7D8C9B00FBF588 /* Parse */ = {
isa = PBXGroup;
children = (
- DE1F22710A7D8D5800FBF588 /* Parser.cpp */,
- DE1F22720A7D8D5800FBF588 /* ParserActions.cpp */,
+ DE1F246D0A7DC99000FBF588 /* Actions.cpp */,
+ DE1F257A0A7DD86800FBF588 /* Declarations.cpp */,
+ DE1F246E0A7DC99000FBF588 /* Parse.cpp */,
+ DE1F246F0A7DC99000FBF588 /* ParseDeclarations.cpp */,
);
name = Parse;
sourceTree = "<group>";
@@ -352,8 +362,10 @@
DED7D7C90A5242E6003AD0FB /* Preprocessor.cpp in Sources */,
DED7D9E50A5257F6003AD0FB /* ScratchBuffer.cpp in Sources */,
DEAEECD50A5AF1FE0045101B /* PrintPreprocessedOutput.cpp in Sources */,
- DE1F22730A7D8D5800FBF588 /* Parser.cpp in Sources */,
- DE1F22740A7D8D5800FBF588 /* ParserActions.cpp in Sources */,
+ DE1F24700A7DC99000FBF588 /* Actions.cpp in Sources */,
+ DE1F24710A7DC99000FBF588 /* Parse.cpp in Sources */,
+ DE1F24720A7DC99000FBF588 /* ParseDeclarations.cpp in Sources */,
+ DE1F257B0A7DD86800FBF588 /* Declarations.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
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=38805&r1=38804&r2=38805&view=diff
==============================================================================
--- cfe/cfe/trunk/include/clang/Basic/DiagnosticKinds.def (original)
+++ cfe/cfe/trunk/include/clang/Basic/DiagnosticKinds.def Wed Jul 11 11:24:47 2007
@@ -239,4 +239,8 @@
DIAG(ext_top_level_semi, EXTENSION,
"ISO C does not allow extra ';' outside of a function")
+
+DIAG(err_invalid_decl_spec_combination, ERROR,
+ "cannot combine declaration specifier with previous '%s' specifier")
+
#undef DIAG
Added: cfe/cfe/trunk/include/clang/Parse/DeclSpec.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/include/clang/Parse/DeclSpec.h?rev=38805&view=auto
==============================================================================
--- cfe/cfe/trunk/include/clang/Parse/DeclSpec.h (added)
+++ cfe/cfe/trunk/include/clang/Parse/DeclSpec.h Wed Jul 11 11:24:47 2007
@@ -0,0 +1,131 @@
+//===--- Declarations.h - Declaration Representation ------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Chris Lattner and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines interfaces used for Declarations.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_PARSE_DECLARATIONS_H
+#define LLVM_CLANG_PARSE_DECLARATIONS_H
+
+#include "clang/Basic/Diagnostic.h"
+
+namespace llvm {
+namespace clang {
+
+/// DeclSpec - This class captures information about "declaration specifiers",
+/// which encompases storage-class-specifiers, type-specifiers, type-qualifiers,
+/// and function-specifiers.
+class DeclSpec {
+public:
+ // storage-class-specifier
+ enum SCS {
+ SCS_unspecified,
+ SCS_typedef,
+ SCS_extern,
+ SCS_static,
+ SCS_auto,
+ SCS_register
+ } StorageClassSpec : 3;
+
+ // type-specifier
+ enum TSW {
+ TSW_unspecified,
+ TSW_short,
+ TSW_long,
+ TSW_longlong
+ } TypeSpecWidth : 2;
+
+ enum TSC {
+ TSC_unspecified,
+ TSC_imaginary,
+ TSC_complex
+ } TypeSpecComplex : 2;
+
+ enum TSS {
+ TSS_unspecified,
+ TSS_signed,
+ TSS_unsigned
+ } TypeSpecSign : 2;
+
+ enum TST {
+ TST_unspecified,
+ TST_void,
+ TST_char,
+ TST_int,
+ TST_float,
+ TST_double,
+ TST_bool, // _Bool
+ TST_decimal32, // _Decimal32
+ TST_decimal64, // _Decimal64
+ TST_decimal128 // _Decimal128
+ } TypeSpecType : 4;
+
+ // type-qualifiers
+ enum TQ {
+ TQ_unspecified = 0,
+ TQ_const = 1,
+ TQ_restrict = 2,
+ TQ_volatile = 4
+ };
+ unsigned TypeQualifiers : 3; // Bitwise OR of typequals.
+
+ // function-specifier
+ enum FS {
+ FS_unspecified,
+ FS_inline
+ } FuncSpec : 1;
+
+ // attributes.
+ // FIXME: implement declspec attributes.
+
+ // Flags to query which specifiers were applied.
+ enum ParsedSpecifiers {
+ PQ_None = 0,
+ PQ_StorageClassSpecifier = 1,
+ PQ_TypeSpecifier = 2,
+ PQ_TypeQualifier = 4,
+ PQ_FunctionSpecifier = 8
+ };
+
+ DeclSpec()
+ : StorageClassSpec(SCS_unspecified),
+ TypeSpecWidth(TSW_unspecified),
+ TypeSpecComplex(TSC_unspecified),
+ TypeSpecSign(TSS_unspecified),
+ TypeSpecType(TST_unspecified),
+ TypeQualifiers(TSS_unspecified),
+ FuncSpec(FS_unspecified) {
+ }
+
+ /// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
+ /// DeclSpec includes.
+ ///
+ unsigned getParsedSpecifiers() const;
+
+ /// These methods set the specified attribute of the DeclSpec, but return true
+ /// and ignore the request if invalid (e.g. "extern" then "auto" is
+ /// specified). The name of the previous specifier is returned in prevspec.
+ bool SetTypeSpecWidth(TSW W, const char *&PrevSpec);
+ bool SetTypeSpecComplex(TSC C, const char *&PrevSpec);
+ bool SetTypeSpecSign(TSS S, const char *&PrevSpec);
+ bool SetTypeSpecType(TST T, const char *&PrevSpec);
+ bool SetFuncSpec(FS F, const char *&PrevSpec);
+
+ /// Finish - This does final analysis of the declspec, rejecting things like
+ /// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or
+ /// diag::NUM_DIAGNOSTICS if there is no error. After calling this method,
+ /// DeclSpec is guaranteed self-consistent, even if an error occurred.
+ diag::kind Finish();
+};
+
+} // end namespace clang
+} // end namespace llvm
+
+#endif
Propchange: cfe/cfe/trunk/include/clang/Parse/DeclSpec.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cfe/cfe/trunk/include/clang/Parse/DeclSpec.h
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
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=38805&r1=38804&r2=38805&view=diff
==============================================================================
--- cfe/cfe/trunk/include/clang/Parse/Parser.h (original)
+++ cfe/cfe/trunk/include/clang/Parse/Parser.h Wed Jul 11 11:24:47 2007
@@ -20,6 +20,7 @@
namespace llvm {
namespace clang {
class ParserActions;
+ class DeclSpec;
/// Parser - This implements a parser for the C family of languages. After
/// parsing units of the grammar, productions are invoked to handle whatever has
@@ -47,11 +48,13 @@
// Diagnostics.
- void Diag(const LexerToken &Tok, unsigned DiagID, const std::string &Msg="");
- void Diag(unsigned DiagID, const std::string &Msg="") {
+ void Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg = "");
+ void Diag(const LexerToken &Tok, unsigned DiagID, const std::string &M = "") {
+ Diag(Tok.getLocation(), DiagID, M);
+ }
+ void Diag(unsigned DiagID, const std::string &Msg = "") {
Diag(Tok, DiagID, Msg);
}
-
/// ConsumeToken - Consume the current 'peek token', lexing a new one and
/// returning the token kind.
@@ -69,7 +72,7 @@
//===--------------------------------------------------------------------===//
// C99 6.7: Declarations.
- void ParseDeclarationSpecifiers();
+ void ParseDeclarationSpecifiers(DeclSpec &DS);
void ParseDeclarator();
void ParseTypeQualifierListOpt();
More information about the cfe-commits
mailing list