summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2015-03-19 18:47:47 +0000
committerReid Kleckner <reid@kleckner.net>2015-03-19 18:47:47 +0000
commit461c0c693421fe7fb37da598632fca9c02c4c5d1 (patch)
tree49792ec1914fe1848a58c64da5b6d40b92530600 /clang
parent5196fe7c197a56548a4df99287e08ad3903927ff (diff)
downloadbcm5719-llvm-461c0c693421fe7fb37da598632fca9c02c4c5d1.tar.gz
bcm5719-llvm-461c0c693421fe7fb37da598632fca9c02c4c5d1.zip
Fix -ast-dump of dependent new and delete exprs
llvm-svn: 232748
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/ASTDumper.cpp20
-rw-r--r--clang/test/Misc/ast-dump-stmt.cpp10
2 files changed, 22 insertions, 8 deletions
diff --git a/clang/lib/AST/ASTDumper.cpp b/clang/lib/AST/ASTDumper.cpp
index 6aa0a2183d8..a5ad6db3797 100644
--- a/clang/lib/AST/ASTDumper.cpp
+++ b/clang/lib/AST/ASTDumper.cpp
@@ -1921,24 +1921,28 @@ void ASTDumper::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node) {
void ASTDumper::VisitCXXNewExpr(const CXXNewExpr *Node) {
VisitExpr(Node);
- OS << ' ';
if (Node->isGlobalNew())
- OS << "global ";
+ OS << " global";
if (Node->isArray())
- OS << "array ";
- dumpBareDeclRef(Node->getOperatorNew());
+ OS << " array";
+ if (Node->getOperatorNew()) {
+ OS << ' ';
+ dumpBareDeclRef(Node->getOperatorNew());
+ }
// We could dump the deallocation function used in case of error, but it's
// usually not that interesting.
}
void ASTDumper::VisitCXXDeleteExpr(const CXXDeleteExpr *Node) {
VisitExpr(Node);
- OS << ' ';
if (Node->isGlobalDelete())
- OS << "global ";
+ OS << " global";
if (Node->isArrayForm())
- OS << "array ";
- dumpBareDeclRef(Node->getOperatorDelete());
+ OS << " array";
+ if (Node->getOperatorDelete()) {
+ OS << ' ';
+ dumpBareDeclRef(Node->getOperatorDelete());
+ }
}
void
diff --git a/clang/test/Misc/ast-dump-stmt.cpp b/clang/test/Misc/ast-dump-stmt.cpp
index 472c71365e1..96921ff7b6e 100644
--- a/clang/test/Misc/ast-dump-stmt.cpp
+++ b/clang/test/Misc/ast-dump-stmt.cpp
@@ -55,3 +55,13 @@ void TestAllocationExprs() {
// CHECK: CXXDeleteExpr {{.*}} 'void' array Function {{.*}} 'operator delete[]'
// CHECK: CXXNewExpr {{.*}} 'int *' global Function {{.*}} 'operator new'
// CHECK: CXXDeleteExpr {{.*}} 'void' global Function {{.*}} 'operator delete'
+
+// Don't crash on dependent exprs that haven't been resolved yet.
+template <typename T>
+void TestDependentAllocationExpr() {
+ T *p = new T;
+ delete p;
+}
+// CHECK: FunctionTemplateDecl {{.*}} TestDependentAllocationExpr
+// CHECK: CXXNewExpr {{.*'T \*'$}}
+// CHECK: CXXDeleteExpr {{.*'void'$}}
OpenPOWER on IntegriCloud