diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-02-24 21:16:19 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-02-24 21:16:19 +0000 |
commit | d3f2d321d76fa231d82959769b9d71b16374aef1 (patch) | |
tree | 9967bcc8f56de173792864a6293f0ab1516a66b3 | |
parent | f4f8740eb059d74f7bdaa2a9106d910c8d12322b (diff) | |
download | bcm5719-llvm-d3f2d321d76fa231d82959769b9d71b16374aef1.tar.gz bcm5719-llvm-d3f2d321d76fa231d82959769b9d71b16374aef1.zip |
PR22673: Don't forget to check a constructor for deletedness when we use it to
implicitly construct a temporary in a reference binding.
llvm-svn: 230381
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 10 | ||||
-rw-r--r-- | clang/test/SemaCXX/deleted-function.cpp | 4 |
2 files changed, 9 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 53b75acbe3d..7a76f6ae765 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -2591,6 +2591,8 @@ static ExprResult BuildCXXCastArgument(Sema &S, S.CheckConstructorAccess(CastLoc, Constructor, InitializedEntity::InitializeTemporary(Ty), Constructor->getAccess()); + if (S.DiagnoseUseOfDecl(FoundDecl, CastLoc)) + return ExprError(); ExprResult Result = S.BuildCXXConstructExpr( CastLoc, Ty, cast<CXXConstructorDecl>(Method), @@ -2606,6 +2608,10 @@ static ExprResult BuildCXXCastArgument(Sema &S, case CK_UserDefinedConversion: { assert(!From->getType()->isPointerType() && "Arg can't have pointer type!"); + S.CheckMemberOperatorAccess(CastLoc, From, /*arg*/ nullptr, FoundDecl); + if (S.DiagnoseUseOfDecl(FoundDecl, CastLoc)) + return ExprError(); + // Create an implicit call expr that calls it. CXXConversionDecl *Conv = cast<CXXConversionDecl>(Method); ExprResult Result = S.BuildCXXMemberCallExpr(From, FoundDecl, Conv, @@ -2617,8 +2623,6 @@ static ExprResult BuildCXXCastArgument(Sema &S, CK_UserDefinedConversion, Result.get(), nullptr, Result.get()->getValueKind()); - S.CheckMemberOperatorAccess(CastLoc, From, /*arg*/ nullptr, FoundDecl); - return S.MaybeBindToTemporary(Result.get()); } } @@ -2649,7 +2653,7 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType, FunctionDecl *FD = ICS.UserDefined.ConversionFunction; CastKind CastKind; QualType BeforeToType; - assert(FD && "FIXME: aggregate initialization from init list"); + assert(FD && "no conversion function for user-defined conversion seq"); if (const CXXConversionDecl *Conv = dyn_cast<CXXConversionDecl>(FD)) { CastKind = CK_UserDefinedConversion; diff --git a/clang/test/SemaCXX/deleted-function.cpp b/clang/test/SemaCXX/deleted-function.cpp index 47b9c6a194d..eab1f34692a 100644 --- a/clang/test/SemaCXX/deleted-function.cpp +++ b/clang/test/SemaCXX/deleted-function.cpp @@ -67,7 +67,7 @@ void test4() {} // expected-note {{previous definition is here}} void test4() = delete; // expected-error {{redefinition of 'test4'}} struct DelCtor { // expected-note 4{{implicit}} - DelCtor(int) = delete; // expected-note 13{{deleted}} + DelCtor(int) = delete; // expected-note 14{{deleted}} // ensure the class is not an aggregate DelCtor(int, int, int, int); }; @@ -85,5 +85,5 @@ int use_dc(DelCtor); // expected-note 2{{here}} int dc11 = use_dc(0); // expected-error {{deleted}} int dc12 = use_dc({0}); // expected-error {{deleted}} int use_dcr(const DelCtor &); // expected-note {{here}} -int dc13 = use_dcr(0); // FIXME PR22673: should reject this +int dc13 = use_dcr(0); // expected-error {{deleted}} int dc14 = use_dcr({0}); // expected-error {{deleted}} |