diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-25 08:47:54 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-25 08:47:54 +0000 |
commit | 5153ee66d6d4fb37b02f85df38e48dc8b46660df (patch) | |
tree | 09fbc6dd5a9a2953119ac1935394f0aa08453342 /lib/Sema/SemaType.cpp | |
parent | 6e4750188e836e119f8605cbd34023d0a3b18011 (diff) |
Change SemaType's "GetTypeForDeclarator" and "ConvertDeclSpecToType" to
always return a non-null QualType + error bit. This fixes a bunch of
cases that didn't check for null result (and could thus crash) and eliminates
some crappy code scattered throughout sema.
This also improves the diagnostics in the recursive struct case to eliminate
a bogus second error. It also cleans up the case added to function.c by forming
a proper function type even though the declarator is erroneous, allowing the
parameter to be added to the function. Before:
t.c:2:1: error: unknown type name 'unknown_type'
unknown_type f(void*P)
^
t.c:4:3: error: use of undeclared identifier 'P'
P+1;
^
After:
t.c:2:1: error: unknown type name 'unknown_type'
unknown_type f(void*P)
^
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70023 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaType.cpp')
-rw-r--r-- | lib/Sema/SemaType.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 7519aff630..883cf221fb 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -47,8 +47,8 @@ QualType Sema::adjustParameterType(QualType T) { /// object. /// \param DS the declaration specifiers /// \param DeclLoc The location of the declarator identifier or invalid if none. -/// \returns The type described by the declaration specifiers, or NULL -/// if there was an error. +/// \returns The type described by the declaration specifiers. This function +/// never returns null. QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS, SourceLocation DeclLoc, bool &isInvalid) { @@ -176,6 +176,9 @@ QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS, "Can't handle qualifiers on typedef names yet!"); // TypeQuals handled by caller. Result = Context.getTypeDeclType(cast<TypeDecl>(D)); + + if (D->isInvalidDecl()) + isInvalid = true; break; } case DeclSpec::TST_typename: { @@ -232,7 +235,9 @@ QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS, break; } case DeclSpec::TST_error: - return QualType(); + Result = Context.IntTy; + isInvalid = true; + break; } // Handle complex types. @@ -624,8 +629,6 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S, unsigned Skip) { } else { bool isInvalid = false; T = ConvertDeclSpecToType(DS, D.getIdentifierLoc(), isInvalid); - if (T.isNull()) - return T; if (isInvalid) D.setInvalidType(true); } @@ -938,7 +941,7 @@ Sema::TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) { assert(D.getIdentifier() == 0 && "Type name should have no identifier!"); QualType T = GetTypeForDeclarator(D, S); - if (T.isNull()) + if (D.isInvalidType()) return true; // Check that there are no default arguments (C++ only). |