]> granicus.if.org Git - clang/commitdiff
Change SemaType's "GetTypeForDeclarator" and "ConvertDeclSpecToType" to
authorChris Lattner <sabre@nondot.org>
Sat, 25 Apr 2009 08:47:54 +0000 (08:47 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 25 Apr 2009 08:47:54 +0000 (08:47 +0000)
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

lib/Sema/SemaDecl.cpp
lib/Sema/SemaExpr.cpp
lib/Sema/SemaType.cpp
test/Sema/function.c
test/Sema/nested-redef.c
test/SemaObjC/ivar-sem-check-1.m

index fd6cf525b9757b47b3ea8812c4d51b43fb04f0f4..914e304557918719f01e8ce241f0d70de04067f0 100644 (file)
@@ -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
index 781c64c22c2314ef18d961fa961c3ac24db83744..fc5b678f21baf0cdb6ab9f967ee4033b379c788b 100644 (file)
@@ -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;
   }
 
index 7519aff630a8ba93f517ff1ff3f3f6f97cfe03ec..883cf221fba88ebc26925ed13689dbbd6be0da45 100644 (file)
@@ -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).
index 974f6e973725bfeef91e0f15ec8a1f680858e8e3..8b5c8572076072cde4a9c47d9409fce67f2a4303 100644 (file)
@@ -80,6 +80,10 @@ typedef void fn_t(void);
 fn_t t17;
 
 // PR4049
-unknown_type t18(void*) {   // expected-error {{unknown type name 'unknown_type'}}
+unknown_type t18(void*) {   // expected-error {{unknown type name 'unknown_type'}} expected-error{{parameter name omitted}}
+}
+
+unknown_type t19(int* P) {   // expected-error {{unknown type name 'unknown_type'}}
+  P = P+1;  // no warning.
 }
 
index 53b22d6989310547bed99715a62569a22a7ece07..ea180910128b95ca100ad721a106c1155208505f 100644 (file)
@@ -1,7 +1,6 @@
 // RUN: clang-cc -fsyntax-only -verify %s
 struct X { // expected-note{{previous definition is here}}
-  struct X { } x; // expected-error{{nested redefinition of 'X'}} \
-                     expected-error {{field has incomplete type}}
+  struct X { } x; // expected-error{{nested redefinition of 'X'}}
 }; 
 
 struct Y { };
index ab9f6b163c57d7fdfb3a364c0aadf2a871b718d9..957abc397e89846f65a273ad230f9e512d4e1708 100644 (file)
@@ -9,8 +9,7 @@ typedef int FOO();
        int arr[];  // expected-error {{field has incomplete type}}
        struct S IC;  // expected-error {{field has incomplete type}}
        struct T { // expected-note {{previous definition is here}}
-         struct T {} X;  // expected-error {{nested redefinition of 'T'}} \
-                             expected-error {{field has incomplete type}}
+         struct T {} X;  // expected-error {{nested redefinition of 'T'}}
        }YYY; 
        FOO    BADFUNC;  // expected-error {{field 'BADFUNC' declared as a function}}
        int kaka;       // expected-note {{previous declaration is here}}