diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-04-22 17:45:37 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-04-22 17:45:37 +0000 |
| commit | 7a6f2a358a008c6ecb6921a90682c710cead4311 (patch) | |
| tree | 71412a8317124002ddc776fd2358637037d1582f /clang | |
| parent | bbe3862d95d4d294264f0e996582662edc5f9f78 (diff) | |
| download | bcm5719-llvm-7a6f2a358a008c6ecb6921a90682c710cead4311.tar.gz bcm5719-llvm-7a6f2a358a008c6ecb6921a90682c710cead4311.zip | |
In IsUserDefinedConversion try to recover from RequireCompleteType returning true.
Fixes an assertion later on, rdar://9122862 & http://llvm.org/PR9460.
llvm-svn: 130000
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 6 | ||||
| -rw-r--r-- | clang/test/SemaCXX/PR9460.cpp | 19 |
2 files changed, 24 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 9caf6736017..9c9ff6ddea0 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -2230,7 +2230,11 @@ IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType, S.IsDerivedFrom(From->getType(), ToType))) ConstructorsOnly = true; - if (S.RequireCompleteType(From->getLocStart(), ToType, S.PDiag())) { + S.RequireCompleteType(From->getLocStart(), ToType, S.PDiag()); + // RequireCompleteType may have returned true due to some invalid decl + // during template instantiation, but ToType may be complete enough now + // to try to recover. + if (ToType->isIncompleteType()) { // We're not going to find any constructors. } else if (CXXRecordDecl *ToRecordDecl = dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) { diff --git a/clang/test/SemaCXX/PR9460.cpp b/clang/test/SemaCXX/PR9460.cpp new file mode 100644 index 00000000000..be8dc6eb304 --- /dev/null +++ b/clang/test/SemaCXX/PR9460.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// Don't crash. + +template<typename aT> +struct basic_string{ + a; // expected-error {{requires a type specifier}} + basic_string(aT*); +}; + +struct runtime_error{ +runtime_error( +basic_string<char> struct{ // expected-error {{cannot combine with previous 'type-name' declaration specifier}} +a(){ // expected-error {{requires a type specifier}} +runtime_error(0); +} +} +); +}; |

