tra created this revision. tra added a reviewer: arphaman. Herald added subscribers: jlebar, sanjoy.
Both crashes 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. https://reviews.llvm.org/D41788 Files: clang/lib/AST/DeclPrinter.cpp clang/test/Sema/ast-print.c clang/test/SemaCXX/ast-print-crash.cpp Index: clang/test/SemaCXX/ast-print-crash.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/ast-print-crash.cpp @@ -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; Index: clang/test/Sema/ast-print.c =================================================================== --- clang/test/Sema/ast-print.c +++ clang/test/Sema/ast-print.c @@ -15,6 +15,10 @@ }; }; +// This used to crash clang. +struct { +}(s1); + int foo(const struct blah *b) { // CHECK: return b->b; return b->b; Index: clang/lib/AST/DeclPrinter.cpp =================================================================== --- clang/lib/AST/DeclPrinter.cpp +++ clang/lib/AST/DeclPrinter.cpp @@ -128,9 +128,7 @@ // 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 @@ 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; }
Index: clang/test/SemaCXX/ast-print-crash.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/ast-print-crash.cpp @@ -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; Index: clang/test/Sema/ast-print.c =================================================================== --- clang/test/Sema/ast-print.c +++ clang/test/Sema/ast-print.c @@ -15,6 +15,10 @@ }; }; +// This used to crash clang. +struct { +}(s1); + int foo(const struct blah *b) { // CHECK: return b->b; return b->b; Index: clang/lib/AST/DeclPrinter.cpp =================================================================== --- clang/lib/AST/DeclPrinter.cpp +++ clang/lib/AST/DeclPrinter.cpp @@ -128,9 +128,7 @@ // 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 @@ 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; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits