summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2012-10-10 16:14:06 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2012-10-10 16:14:06 +0000
commit8e50297652a012845daa7d9ea7726fe5b760de77 (patch)
tree0ac18b9571db8591b9272b007115206047088a57 /clang
parent9a37b94c95a8a91c35bf1a39091f0ad9305d919e (diff)
downloadbcm5719-llvm-8e50297652a012845daa7d9ea7726fe5b760de77.tar.gz
bcm5719-llvm-8e50297652a012845daa7d9ea7726fe5b760de77.zip
Fix stack overflow when trying to create an implicit moving
constructor with invalid code. rdar://12240916 llvm-svn: 165623
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp2
-rw-r--r--clang/test/SemaCXX/cxx11-crashes.cpp38
2 files changed, 39 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index c898d81a61d..12452b2429b 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -8154,7 +8154,7 @@ hasMoveOrIsTriviallyCopyable(Sema &S, QualType Type, bool IsConstructor) {
// reference types, are supposed to return false here, but that appears
// to be a standard defect.
CXXRecordDecl *ClassDecl = Type->getAsCXXRecordDecl();
- if (!ClassDecl || !ClassDecl->getDefinition())
+ if (!ClassDecl || !ClassDecl->getDefinition() || ClassDecl->isInvalidDecl())
return true;
if (Type.isTriviallyCopyableType(S.Context))
diff --git a/clang/test/SemaCXX/cxx11-crashes.cpp b/clang/test/SemaCXX/cxx11-crashes.cpp
new file mode 100644
index 00000000000..d5db10962f9
--- /dev/null
+++ b/clang/test/SemaCXX/cxx11-crashes.cpp
@@ -0,0 +1,38 @@
+// RUN: %clang_cc1 -std=c++11 -verify %s
+
+// rdar://12240916 stack overflow.
+namespace rdar12240916 {
+
+struct S2 {
+ S2(const S2&);
+ S2();
+};
+
+struct S { // expected-note {{not complete}}
+ S x; // expected-error {{incomplete type}}
+ S2 y;
+};
+
+S foo() {
+ S s;
+ return s;
+}
+
+struct S3; // expected-note {{forward declaration}}
+
+struct S4 {
+ S3 x; // expected-error {{incomplete type}}
+ S2 y;
+};
+
+struct S3 {
+ S4 x;
+ S2 y;
+};
+
+S4 foo2() {
+ S4 s;
+ return s;
+}
+
+}
OpenPOWER on IntegriCloud