diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp
index d91420d..4510f00 100644
--- a/Sema/SemaDecl.cpp
+++ b/Sema/SemaDecl.cpp
@@ -304,6 +304,8 @@
     PrevDecl = 0;   // If in outer scope, it isn't the same thing.
 
   Decl *New;
+  bool InvalidDecl = false;
+  
   if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef) {
     assert(Init == 0 && "Can't have initializer for a typedef!");
     TypedefDecl *NewTD = ParseTypedefDecl(S, D, LastDeclarator);
@@ -323,13 +325,14 @@
       // then it shall have block scope.
       if (ArrayType *ary = dyn_cast<ArrayType>(NewTD->getUnderlyingType())) {
         if (VerifyConstantArrayType(ary, D.getIdentifierLoc()))
-          return 0;
+          InvalidDecl = true;
       }
     }
   } else if (D.isFunctionDeclarator()) {
     assert(Init == 0 && "Can't have an initializer for a functiondecl!");
+    
     QualType R = GetTypeForDeclarator(D, S);
-    if (R.isNull()) return 0; // FIXME: "auto func();" passes through...
+    assert(!R.isNull() && "GetTypeForDeclarator() returned null type");
 
     FunctionDecl::StorageClass SC;
     switch (D.getDeclSpec().getStorageClassSpec()) {
@@ -338,7 +341,8 @@
       case DeclSpec::SCS_register:
         Diag(D.getIdentifierLoc(), diag::err_typecheck_sclass_func,
              R.getAsString());
-        return 0;
+        InvalidDecl = true;
+        break;
       case DeclSpec::SCS_unspecified: SC = FunctionDecl::None; break;
       case DeclSpec::SCS_extern:      SC = FunctionDecl::Extern; break;
       case DeclSpec::SCS_static:      SC = FunctionDecl::Static; break;
@@ -356,9 +360,7 @@
     New = NewFD;
   } else {
     QualType R = GetTypeForDeclarator(D, S);
-    
     assert(!R.isNull() && "GetTypeForDeclarator() returned null type");
-    bool InvalidDecl = false;
 
     VarDecl *NewVD;
     VarDecl::StorageClass SC;
@@ -420,9 +422,6 @@
       }
       NewVD = new BlockVarDecl(D.getIdentifierLoc(), II, R, SC, LastDeclarator);
     }
-    if (InvalidDecl)
-      NewVD->setInvalidDecl();
-      
     // Handle attributes prior to checking for duplicates in MergeVarDecl
     HandleDeclAttributes(NewVD, D.getDeclSpec().getAttributes(),
                          D.getAttributes());
@@ -450,6 +449,10 @@
   
   if (S->getParent() == 0)
     AddTopLevelDecl(New, LastDeclarator);
+
+  // If any semantic error occurred, mark the decl as invalid.
+  if (D.getInvalidType() || InvalidDecl)
+    New->setInvalidDecl();
   
   return New;
 }
@@ -649,11 +652,14 @@
   assert(D.getIdentifier() && "Wrong callback for declspec without declarator");
   
   QualType T = GetTypeForDeclarator(D, S);
-  if (T.isNull()) return 0;
+  assert(!T.isNull() && "GetTypeForDeclarator() returned null type");
   
   // Scope manipulation handled by caller.
-  return new TypedefDecl(D.getIdentifierLoc(), D.getIdentifier(), T,
-                         LastDeclarator);
+  TypedefDecl *NewTD = new TypedefDecl(D.getIdentifierLoc(), D.getIdentifier(), 
+                                       T, LastDeclarator);
+  if (D.getInvalidType())
+    NewTD->setInvalidDecl();
+  return NewTD;
 }
 
 
@@ -789,17 +795,21 @@
   }
   
   QualType T = GetTypeForDeclarator(D, S);
-  if (T.isNull()) return 0;
+  assert(!T.isNull() && "GetTypeForDeclarator() returned null type");
+  bool InvalidDecl = false;
   
   // C99 6.7.2.1p8: A member of a structure or union may have any type other
   // than a variably modified type.
   if (const ArrayType *ary = T->getAsArrayType()) {
     if (VerifyConstantArrayType(ary, Loc))
-      return 0;
+      InvalidDecl = true;
   }
   
   // FIXME: Chain fielddecls together.
-  return new FieldDecl(Loc, II, T, 0);
+  FieldDecl *NewFD = new FieldDecl(Loc, II, T, 0);
+  if (D.getInvalidType() || InvalidDecl)
+    NewFD->setInvalidDecl();
+  return NewFD;
 }
 
 void Sema::ParseRecordBody(SourceLocation RecLoc, DeclTy *RecDecl,
diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp
index bea6e99..eb7daf1 100644
--- a/Sema/SemaExpr.cpp
+++ b/Sema/SemaExpr.cpp
@@ -76,7 +76,7 @@
   }
   if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
     // Only create DeclRefExpr's for valid Decl's.
-    if (VD->getInvalidDecl())
+    if (VD->isInvalidDecl())
       return true;
     return new DeclRefExpr(VD, VD->getType(), Loc);
   }
diff --git a/Sema/SemaType.cpp b/Sema/SemaType.cpp
index 04264a3..3bc0e76 100644
--- a/Sema/SemaType.cpp
+++ b/Sema/SemaType.cpp
@@ -278,11 +278,12 @@
   assert(D.getIdentifier() == 0 && "Type name should have no identifier!");
   
   QualType T = GetTypeForDeclarator(D, S);
+
+  assert(!T.isNull() && "GetTypeForDeclarator() returned null type");
   
-  // If the type of the declarator was invalid, this is an invalid typename.
-  if (T.isNull())
-    return true;
-  
+  // In this context, we *do not* check D.getInvalidType(). If the declarator
+  // type was invalid, GetTypeForDeclarator() still returns a "valid" type,
+  // though it will not reflect the user specified type.
   return T.getAsOpaquePtr();
 }
 
@@ -292,9 +293,10 @@
   // just want the type converted.
   QualType T = GetTypeForDeclarator(D, S);
   
-  // If the type of the declarator was invalid, this is an invalid typename.
-  if (T.isNull())
-    return true;
-  
+  assert(!T.isNull() && "GetTypeForDeclarator() returned null type");
+
+  // In this context, we *do not* check D.getInvalidType(). If the declarator
+  // type was invalid, GetTypeForDeclarator() still returns a "valid" type,
+  // though it will not reflect the user specified type.
   return T.getAsOpaquePtr();
 }
diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h
index 563921c..1dbe4c1 100644
--- a/include/clang/AST/Decl.h
+++ b/include/clang/AST/Decl.h
@@ -92,7 +92,7 @@
   /// setInvalidDecl - Indicates the Decl had a semantic error. This
   /// allows for graceful error recovery.
   void setInvalidDecl() { InvalidDecl = 1; }
-  int getInvalidDecl() const { return InvalidDecl; }
+  int isInvalidDecl() const { return InvalidDecl; }
   
   /// getNextDeclarator - If this decl was part of a multi-declarator
   /// declaration, such as "int X, Y, *Z;" this returns the decl for the next
