summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-25 08:47:54 +0000
committerChris Lattner <sabre@nondot.org>2009-04-25 08:47:54 +0000
commitedfa8d45572d970a3ccfaad73675eafa269e21d0 (patch)
tree2e35afb00db158527a659ee46a504932379eb3e0 /clang/lib/Sema
parentb41df4f6223aedd30a3a96588420cc035f648ff2 (diff)
downloadbcm5719-llvm-edfa8d45572d970a3ccfaad73675eafa269e21d0.tar.gz
bcm5719-llvm-edfa8d45572d970a3ccfaad73675eafa269e21d0.zip
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) ^ llvm-svn: 70023
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp15
-rw-r--r--clang/lib/Sema/SemaExpr.cpp7
-rw-r--r--clang/lib/Sema/SemaType.cpp15
3 files changed, 9 insertions, 28 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index fd6cf525b97..914e3045579 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1361,13 +1361,6 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, bool IsFunctionDefinition) {
NamedDecl *New;
QualType R = GetTypeForDeclarator(D, S);
- if (R.isNull()) {
- D.setInvalidType();
- R = Context.IntTy;
- if (IsFunctionDefinition) // int(...)
- R = Context.getFunctionType(R, 0, 0, true, 0);
-
- }
// See if this is a redefinition of a variable in the same scope.
if (D.getCXXScopeSpec().isInvalid()) {
@@ -2798,10 +2791,6 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
CheckExtraCXXDefaultArguments(D);
QualType parmDeclType = GetTypeForDeclarator(D, S);
- if (parmDeclType.isNull()) {
- D.setInvalidType(true);
- parmDeclType = Context.IntTy;
- }
// TODO: CHECK FOR CONFLICTS, multiple decls with same name in one scope.
// Can this happen for params? We already checked that they don't conflict
@@ -3816,10 +3805,6 @@ Sema::DeclPtrTy Sema::ActOnIvar(Scope *S,
// example, unnamed unions inject all members into the struct namespace!
QualType T = GetTypeForDeclarator(D, S);
- if (T.isNull()) {
- D.setInvalidType();
- T = Context.IntTy;
- }
if (BitWidth) {
// 6.7.2.1p3, 6.7.2.1p4
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 781c64c22c2..fc5b678f21b 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -4703,10 +4703,6 @@ void Sema::ActOnBlockArguments(Declarator &ParamInfo, Scope *CurScope) {
|| ParamInfo.getTypeObject(0).Kind != DeclaratorChunk::Function) {
QualType T = GetTypeForDeclarator(ParamInfo, CurScope);
- // The type is entirely optional as well, if none, use DependentTy.
- if (T.isNull())
- T = Context.DependentTy;
-
// The parameter list is optional, if there was none, assume ().
if (!T->isFunctionType())
T = Context.getFunctionType(T, NULL, 0, 0, 0);
@@ -4722,9 +4718,6 @@ void Sema::ActOnBlockArguments(Declarator &ParamInfo, Scope *CurScope) {
diag::err_object_cannot_be_passed_returned_by_value) << 0 << RetTy;
return;
}
-
- if (!RetTy->isDependentType())
- CurBlock->ReturnType = RetTy.getTypePtr();
return;
}
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 7519aff630a..883cf221fba 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/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).
OpenPOWER on IntegriCloud