diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-03-10 03:20:58 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-03-10 03:20:58 +0000 |
commit | a346efaaad5cd779cdfd5be73c2b258748ad1f06 (patch) | |
tree | d544a2cd7feeabf1b751043f5358eaa8b9742e09 | |
parent | cb00cc44dd6a2a24b8b46e88b9e57a12a38a626b (diff) |
[Sema] A tag decl that is marked as invalid and is used in a decl-spec,
should not impede creating a proper TypeLoc info for the decl-spec.
This improves our semantic error recovery.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152481 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/TypeLoc.h | 5 | ||||
-rw-r--r-- | lib/Sema/SemaType.cpp | 3 | ||||
-rw-r--r-- | test/Index/index-invalid-code.m | 8 |
3 files changed, 11 insertions, 5 deletions
diff --git a/include/clang/AST/TypeLoc.h b/include/clang/AST/TypeLoc.h index 1c750965ae..aab87be7c4 100644 --- a/include/clang/AST/TypeLoc.h +++ b/include/clang/AST/TypeLoc.h @@ -572,8 +572,9 @@ public: /// \brief True if the tag was defined in this type specifier. bool isDefinition() const { - return getDecl()->isCompleteDefinition() && - (getNameLoc().isInvalid() || getNameLoc() == getDecl()->getLocation()); + TagDecl *D = getDecl(); + return D->isCompleteDefinition() && + (D->getIdentifier() == 0 || D->getLocation() == getNameLoc()); } }; diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 505cc8f769..919faa0a3c 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -766,9 +766,6 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { ElaboratedTypeKeyword Keyword = ElaboratedType::getKeywordForTypeSpec(DS.getTypeSpecType()); Result = S.getElaboratedType(Keyword, DS.getTypeSpecScope(), Result); - - if (D->isInvalidDecl()) - declarator.setInvalidType(true); break; } case DeclSpec::TST_typename: { diff --git a/test/Index/index-invalid-code.m b/test/Index/index-invalid-code.m new file mode 100644 index 0000000000..90845330b1 --- /dev/null +++ b/test/Index/index-invalid-code.m @@ -0,0 +1,8 @@ +struct S { + int { +}; +typedef struct S S; + +// RUN: c-index-test -index-file %s | FileCheck %s +// CHECK: [indexDeclaration]: kind: struct | name: S | +// CHECK-NOT: [indexDeclaration]: kind: struct | name: S | |