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

Artem Belevich via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 5 15:08:16 PST 2018


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;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41788.128813.patch
Type: text/x-patch
Size: 2090 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180105/9cbbf585/attachment.bin>


More information about the cfe-commits mailing list