aboutsummaryrefslogtreecommitdiff
path: root/include/clang
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-07-25 00:24:17 +0000
committerChris Lattner <sabre@nondot.org>2007-07-25 00:24:17 +0000
commite80a59cc41d42a970466cb020b6f44c5b8831d70 (patch)
tree638b430c0972a9c8123b74c25db834756b9630fb /include/clang
parent700204c74b455746752e851b25565ebf932f5340 (diff)
Fix a couple of bugs, add some new cool stuff.
1. Fix a todo in Parser::ParseTag, to recover better. On code like that in test/Sema/decl-invalid.c it causes us to return a single error instead of multiple. 2. Fix an error in Sema::ParseDeclarator, where it would crash if the declarator didn't have an identifier. Instead, diagnose the problem. 3. Start adding infrastructure to track the range of locations covered by a declspec or declarator. This is mostly implemented for declspec, but could be improved, it is missing for declarator. Thanks to Neil for pointing out this crash. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40482 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang')
-rw-r--r--include/clang/Basic/DiagnosticKinds.def2
-rw-r--r--include/clang/Basic/SourceLocation.h3
-rw-r--r--include/clang/Parse/DeclSpec.h10
3 files changed, 13 insertions, 2 deletions
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def
index 4069bda645..64de3aa16e 100644
--- a/include/clang/Basic/DiagnosticKinds.def
+++ b/include/clang/Basic/DiagnosticKinds.def
@@ -427,6 +427,8 @@ DIAG(err_invalid_storage_class_in_func_decl, ERROR,
"invalid storage class specifier in function declarator")
DIAG(err_invalid_reference_qualifier_application, ERROR,
"'%0' qualifier may not be applied to a reference")
+DIAG(err_declarator_need_ident, ERROR,
+ "declarator requires an identifier")
// Attributes
DIAG(err_attribute_wrong_number_arguments, ERROR,
diff --git a/include/clang/Basic/SourceLocation.h b/include/clang/Basic/SourceLocation.h
index 6ba17b0530..2ebed47b72 100644
--- a/include/clang/Basic/SourceLocation.h
+++ b/include/clang/Basic/SourceLocation.h
@@ -161,6 +161,9 @@ public:
SourceLocation Begin() const { return B; }
SourceLocation End() const { return E; }
+ void setBegin(SourceLocation b) { B = b; }
+ void setEnd(SourceLocation e) { E = e; }
+
bool isValid() const { return B.isValid() && E.isValid(); }
};
diff --git a/include/clang/Parse/DeclSpec.h b/include/clang/Parse/DeclSpec.h
index 95be993831..7c5fb1a00b 100644
--- a/include/clang/Parse/DeclSpec.h
+++ b/include/clang/Parse/DeclSpec.h
@@ -28,6 +28,9 @@ namespace clang {
/// and function-specifiers.
class DeclSpec {
public:
+ SourceRange Range;
+ const SourceRange &getSourceRange() const { return Range; }
+
// storage-class-specifier
enum SCS {
SCS_unspecified,
@@ -414,8 +417,8 @@ struct DeclaratorChunk {
/// Abstract declarators are used when parsing types, and don't have an
/// identifier. Normal declarators do have ID's.
///
-/// This is NOT intended to be a small value object: this should be a transient
-/// object that lives on the stack.
+/// Instances of this class should be a transient object that lives on the
+/// stack, not objects that are allocated in large quantities on the heap.
class Declarator {
const DeclSpec &DS;
IdentifierInfo *Identifier;
@@ -459,6 +462,9 @@ public:
TheContext getContext() const { return Context; }
+ // getSourceRange - FIXME: This should be implemented.
+ const SourceRange getSourceRange() const { return SourceRange(); }
+
/// clear - Reset the contents of this Declarator.
void clear() {
Identifier = 0;