Fixes PR18762, stop the StmtPrinter for ObjCPropertyRefExpr from crashing on
authorRichard Trieu <rtrieu@google.com>
Thu, 6 Feb 2014 23:26:23 +0000 (23:26 +0000)
committerRichard Trieu <rtrieu@google.com>
Thu, 6 Feb 2014 23:26:23 +0000 (23:26 +0000)
certain receiver types.

llvm-svn: 200953

clang/lib/AST/StmtPrinter.cpp
clang/test/Misc/ast-dump-decl.m

index 6ece8af..f008a12 100644 (file)
@@ -716,9 +716,11 @@ void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
 void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
   if (Node->isSuperReceiver())
     OS << "super.";
-  else if (Node->getBase()) {
+  else if (Node->isObjectReceiver() && Node->getBase()) {
     PrintExpr(Node->getBase());
     OS << ".";
+  } else if (Node->isClassReceiver() && Node->getClassReceiver()) {
+    OS << Node->getClassReceiver()->getName() << ".";
   }
 
   if (Node->isImplicitProperty())
index f8a5e5a..539923b 100644 (file)
@@ -134,3 +134,12 @@ void TestBlockDecl(int x) {
 // CHECK-NEXT:   ...
 // CHECK-NEXT:   capture ParmVar{{.*}} 'x' 'int'
 // CHECK-NEXT:   CompoundStmt
+
+@interface B
++ (int) foo;
+@end
+
+void f() {
+  __typeof__(B.foo) Test;
+}
+// CHECK: VarDecl{{.*}}Test 'typeof (B.foo)':'int'