diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-07-20 19:41:36 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-07-20 19:41:36 +0000 |
commit | 72d74057ea964397dee14d4f6b464cfee1ae4246 (patch) | |
tree | 0c5ef20b1bb3b7601ef6bd076a1bad0e2af8ba9c | |
parent | 070a5d675020b665bc7ee5f1b6dacd4092c7ab69 (diff) | |
download | bcm5719-llvm-72d74057ea964397dee14d4f6b464cfee1ae4246.tar.gz bcm5719-llvm-72d74057ea964397dee14d4f6b464cfee1ae4246.zip |
Add missing check for creating an instance of an abstract class through an
implicit conversion sequence.
llvm-svn: 186769
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 6 | ||||
-rw-r--r-- | clang/test/SemaCXX/abstract.cpp | 7 |
2 files changed, 12 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 39c42118922..4fe613e792c 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -2415,6 +2415,10 @@ static ExprResult BuildCXXCastArgument(Sema &S, CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Method); SmallVector<Expr*, 8> ConstructorArgs; + if (S.RequireNonAbstractType(CastLoc, Ty, + diag::err_allocation_of_abstract_type)) + return ExprError(); + if (S.CompleteConstructorCall(Constructor, From, CastLoc, ConstructorArgs)) return ExprError(); @@ -2500,7 +2504,7 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType, BeforeToType = Ctor->getParamDecl(0)->getType().getNonReferenceType(); } } - // Watch out for elipsis conversion. + // Watch out for ellipsis conversion. if (!ICS.UserDefined.EllipsisConversion) { ExprResult Res = PerformImplicitConversion(From, BeforeToType, diff --git a/clang/test/SemaCXX/abstract.cpp b/clang/test/SemaCXX/abstract.cpp index e20a89009bd..1c5b715775d 100644 --- a/clang/test/SemaCXX/abstract.cpp +++ b/clang/test/SemaCXX/abstract.cpp @@ -250,6 +250,13 @@ namespace test4 { }; } +namespace test5 { + struct A { A(int); virtual ~A() = 0; }; // expected-note {{pure virtual method}} + const A &a = 0; // expected-error {{abstract class}} + void f(const A &a = 0); // expected-error {{abstract class}} + void g() { f(0); } // expected-error {{abstract class}} +} + // PR9247: Crash on invalid in clang::Sema::ActOnFinishCXXMemberSpecification namespace pr9247 { struct A { |