]> granicus.if.org Git - clang/commitdiff
Fix PR4092 by improving error recovery in two ways:
authorChris Lattner <sabre@nondot.org>
Wed, 29 Apr 2009 05:12:23 +0000 (05:12 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 29 Apr 2009 05:12:23 +0000 (05:12 +0000)
1. In a struct field redefinition, don't mark the struct erroneous.  The
   field is erroneous, but the struct is otherwise well formed.
2. Don't emit diagnostics about functions that are known to be broken already.

Either fix is sufficient to silence the second diagnostic in the example,
but the combination is better :)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70371 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/Sema/struct-decl.c

index 4427f0de1f28fdea6f985d78311ebb4901eaefc1..14136a30b691c6b0301f5ee2cc79a45aeaa46677 100644 (file)
@@ -2895,6 +2895,7 @@ Sema::DeclPtrTy Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclPtrTy D) {
   // (C99 6.9.1p3, C++ [dcl.fct]p6).
   QualType ResultType = FD->getResultType();
   if (!ResultType->isDependentType() && !ResultType->isVoidType() &&
+      !FD->isInvalidDecl() &&
       RequireCompleteType(FD->getLocation(), ResultType,
                           diag::err_func_def_incomplete_result))
     FD->setInvalidDecl();
@@ -3713,7 +3714,6 @@ FieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T,
     Diag(Loc, diag::err_duplicate_member) << II;
     Diag(PrevDecl->getLocation(), diag::note_previous_declaration);
     NewFD->setInvalidDecl();
-    Record->setInvalidDecl();
   }
 
   if (getLangOptions().CPlusPlus && !T->isPODType())
index b288850a731af92de174bd37e9a765359a231226..2c0945f9f86bde6df8125f0fd7fadd55670ae153 100644 (file)
@@ -33,3 +33,11 @@ struct datatag {
  char data;
 };
 
+
+// PR4092
+struct s0 {
+  char a;  // expected-note {{previous declaration is here}}
+  char a;  // expected-error {{duplicate member 'a'}}
+};
+
+struct s0 f0(void) {}