[DeclPrinter] Fix two cases that crash clang -ast-print.

Both are related to handling anonymous structures.
* clang didn't handle () around an anonymous struct variable.
* clang also crashed on syntax errors that could lead to other
  syntactic constructs following the declaration of an
  anonymous struct. While the code is invalid, that's not
  a good reason to panic compiler.

Differential Revision: https://reviews.llvm.org/D41788

llvm-svn: 322742
This commit is contained in:
Artem Belevich 2018-01-17 19:29:39 +00:00
parent 9f3fe42e19
commit 224879ea47
3 changed files with 21 additions and 4 deletions

View File

@ -128,9 +128,7 @@ static QualType GetBaseType(QualType T) {
// FIXME: This should be on the Type class!
QualType BaseType = T;
while (!BaseType->isSpecifierType()) {
if (isa<TypedefType>(BaseType))
break;
else if (const PointerType* PTy = BaseType->getAs<PointerType>())
if (const PointerType *PTy = BaseType->getAs<PointerType>())
BaseType = PTy->getPointeeType();
else if (const BlockPointerType *BPy = BaseType->getAs<BlockPointerType>())
BaseType = BPy->getPointeeType();
@ -144,8 +142,11 @@ static QualType GetBaseType(QualType T) {
BaseType = RTy->getPointeeType();
else if (const AutoType *ATy = BaseType->getAs<AutoType>())
BaseType = ATy->getDeducedType();
else if (const ParenType *PTy = BaseType->getAs<ParenType>())
BaseType = PTy->desugar();
else
llvm_unreachable("Unknown declarator!");
// This must be a syntax error.
break;
}
return BaseType;
}

View File

@ -15,6 +15,10 @@ struct blah {
};
};
// This used to crash clang.
struct {
}(s1);
int foo(const struct blah *b) {
// CHECK: return b->b;
return b->b;

View File

@ -0,0 +1,12 @@
// RUN: not %clang_cc1 -triple %ms_abi_triple -ast-print %s -std=gnu++11 \
// RUN: | FileCheck %s
// The test compiles a file with a syntax error which used to cause a crash with
// -ast-print. Compilation fails due to the syntax error, but compiler should
// not crash and print out whatever it manager to parse.
// CHECK: struct {
// CHECK-NEXT: } dont_crash_on_syntax_error;
// CHECK-NEXT: decltype(nullptr) p;
struct {
} dont_crash_on_syntax_error /* missing ; */ decltype(nullptr) p;