diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-10-10 16:14:06 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-10-10 16:14:06 +0000 |
| commit | 8e50297652a012845daa7d9ea7726fe5b760de77 (patch) | |
| tree | 0ac18b9571db8591b9272b007115206047088a57 /clang | |
| parent | 9a37b94c95a8a91c35bf1a39091f0ad9305d919e (diff) | |
| download | bcm5719-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.cpp | 2 | ||||
| -rw-r--r-- | clang/test/SemaCXX/cxx11-crashes.cpp | 38 |
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; +} + +} |

