From: Abramo Bagnara Date: Wed, 16 Nov 2011 22:46:05 +0000 (+0000) Subject: Added missing ImplicitCastExpr around conversion operator call. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=960809e7e9f4a6e949797d20bc081da80495c0e1;p=clang Added missing ImplicitCastExpr around conversion operator call. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144850 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index edb4fef348..7b5c358f7d 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -2099,6 +2099,12 @@ static ExprResult BuildCXXCastArgument(Sema &S, HadMultipleCandidates); if (Result.isInvalid()) return ExprError(); + // Record usage of conversion in an implicit cast. + Result = S.Owned(ImplicitCastExpr::Create(S.Context, + Result.get()->getType(), + CK_UserDefinedConversion, + Result.get(), 0, + Result.get()->getValueKind())); S.CheckMemberOperatorAccess(CastLoc, From, /*arg*/ 0, FoundDecl); @@ -4560,7 +4566,7 @@ ExprResult Sema::BuildCXXMemberCallExpr(Expr *E, NamedDecl *FoundDecl, MemberExpr *ME = new (Context) MemberExpr(Exp.take(), /*IsArrow=*/false, Method, - SourceLocation(), Method->getType(), + SourceLocation(), Context.BoundMemberTy, VK_RValue, OK_Ordinary); if (HadMultipleCandidates) ME->setHadMultipleCandidates(true); diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 3f91bb53e8..1a8231876b 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -4676,9 +4676,9 @@ InitializationSequence::Perform(Sema &S, } bool RequiresCopy = !IsCopy && !isReferenceBinding(Steps.back()); - if (RequiresCopy || shouldBindAsTemporary(Entity)) - CurInit = S.MaybeBindToTemporary(CurInit.takeAs()); - else if (CreatedObject && shouldDestroyTemporary(Entity)) { + bool MaybeBindToTemp = RequiresCopy || shouldBindAsTemporary(Entity); + + if (!MaybeBindToTemp && CreatedObject && shouldDestroyTemporary(Entity)) { QualType T = CurInit.get()->getType(); if (const RecordType *Record = T->getAs()) { CXXDestructorDecl *Destructor @@ -4694,11 +4694,11 @@ InitializationSequence::Perform(Sema &S, CurInit.get()->getType(), CastKind, CurInit.get(), 0, CurInit.get()->getValueKind())); - + if (MaybeBindToTemp) + CurInit = S.MaybeBindToTemporary(CurInit.takeAs()); if (RequiresCopy) CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity, move(CurInit), /*IsExtraneousCopy=*/false); - break; } diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 6977462bc9..adf4dcae1b 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -4309,8 +4309,11 @@ Sema::ConvertToIntegralOrEnumerationType(SourceLocation Loc, Expr *From, HadMultipleCandidates); if (Result.isInvalid()) return ExprError(); - - From = Result.get(); + // Record usage of conversion in an implicit cast. + From = ImplicitCastExpr::Create(Context, Result.get()->getType(), + CK_UserDefinedConversion, + Result.get(), 0, + Result.get()->getValueKind()); } // We'll complain below about a non-integral condition type. @@ -4337,8 +4340,11 @@ Sema::ConvertToIntegralOrEnumerationType(SourceLocation Loc, Expr *From, HadMultipleCandidates); if (Result.isInvalid()) return ExprError(); - - From = Result.get(); + // Record usage of conversion in an implicit cast. + From = ImplicitCastExpr::Create(Context, Result.get()->getType(), + CK_UserDefinedConversion, + Result.get(), 0, + Result.get()->getValueKind()); break; } @@ -9810,6 +9816,10 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj, Conv, HadMultipleCandidates); if (Call.isInvalid()) return ExprError(); + // Record usage of conversion in an implicit cast. + Call = Owned(ImplicitCastExpr::Create(Context, Call.get()->getType(), + CK_UserDefinedConversion, + Call.get(), 0, VK_RValue)); return ActOnCallExpr(S, Call.get(), LParenLoc, MultiExprArg(Args, NumArgs), RParenLoc); diff --git a/test/Analysis/auto-obj-dtors-cfg-output.cpp b/test/Analysis/auto-obj-dtors-cfg-output.cpp index 17aa486de0..e489b9e63f 100644 --- a/test/Analysis/auto-obj-dtors-cfg-output.cpp +++ b/test/Analysis/auto-obj-dtors-cfg-output.cpp @@ -328,7 +328,8 @@ void test_catch_copy() { // CHECK: 9: [B4.8].operator int // CHECK: 10: [B4.9]() // CHECK: 11: [B4.10] -// CHECK: T: if [B4.11] +// CHECK: 12: [B4.11] +// CHECK: T: if [B4.12] // CHECK: Predecessors (1): B5 // CHECK: Successors (2): B3 B2 // CHECK: [ B0 (EXIT) ] @@ -401,7 +402,8 @@ void test_catch_copy() { // CHECK: 9: [B8.8].operator int // CHECK: 10: [B8.9]() // CHECK: 11: [B8.10] -// CHECK: T: if [B8.11] +// CHECK: 12: [B8.11] +// CHECK: T: if [B8.12] // CHECK: Predecessors (1): B9 // CHECK: Successors (2): B7 B4 // CHECK: [ B0 (EXIT) ] @@ -425,7 +427,8 @@ void test_catch_copy() { // CHECK: 7: [B2.6].operator int // CHECK: 8: [B2.7]() // CHECK: 9: [B2.8] -// CHECK: T: while [B2.9] +// CHECK: 10: [B2.9] +// CHECK: T: while [B2.10] // CHECK: Predecessors (2): B3 B5 // CHECK: Successors (2): B4 B1 // CHECK: [ B3 ] @@ -467,7 +470,8 @@ void test_catch_copy() { // CHECK: 7: [B2.6].operator int // CHECK: 8: [B2.7]() // CHECK: 9: [B2.8] -// CHECK: T: while [B2.9] +// CHECK: 10: [B2.9] +// CHECK: T: while [B2.10] // CHECK: Predecessors (2): B3 B11 // CHECK: Successors (2): B10 B1 // CHECK: [ B3 ] @@ -637,7 +641,8 @@ void test_catch_copy() { // CHECK: 8: [B2.7] // CHECK: 9: [B2.8].operator int // CHECK: 10: [B2.9]() -// CHECK: T: switch [B2.10] +// CHECK: 11: [B2.10] +// CHECK: T: switch [B2.11] // CHECK: Predecessors (1): B4 // CHECK: Successors (1): B1 // CHECK: [ B3 ] @@ -671,7 +676,8 @@ void test_catch_copy() { // CHECK: 8: [B2.7] // CHECK: 9: [B2.8].operator int // CHECK: 10: [B2.9]() -// CHECK: T: switch [B2.10] +// CHECK: 11: [B2.10] +// CHECK: T: switch [B2.11] // CHECK: Predecessors (1): B9 // CHECK: Successors (3): B3 B8 // CHECK: B1 @@ -735,7 +741,8 @@ void test_catch_copy() { // CHECK: 7: [B2.6].operator int // CHECK: 8: [B2.7]() // CHECK: 9: [B2.8] -// CHECK: T: for (...; [B2.9]; ) +// CHECK: 10: [B2.9] +// CHECK: T: for (...; [B2.10]; ) // CHECK: Predecessors (2): B3 B5 // CHECK: Successors (2): B4 B1 // CHECK: [ B3 ] @@ -778,7 +785,8 @@ void test_catch_copy() { // CHECK: 7: [B2.6].operator int // CHECK: 8: [B2.7]() // CHECK: 9: [B2.8] -// CHECK: T: for (...; [B2.9]; ) +// CHECK: 10: [B2.9] +// CHECK: T: for (...; [B2.10]; ) // CHECK: Predecessors (2): B3 B11 // CHECK: Successors (2): B10 B1 // CHECK: [ B3 ] diff --git a/test/Analysis/temp-obj-dtors-cfg-output.cpp b/test/Analysis/temp-obj-dtors-cfg-output.cpp index f00227a260..4a16769f85 100644 --- a/test/Analysis/temp-obj-dtors-cfg-output.cpp +++ b/test/Analysis/temp-obj-dtors-cfg-output.cpp @@ -163,11 +163,11 @@ TestCtorInits::TestCtorInits() // CHECK: Predecessors (1): B3 // CHECK: Successors (1): B1 // CHECK: [ B3 ] -// CHECK: 1: [B4.5] && [B5.4] +// CHECK: 1: [B4.6] && [B5.5] // CHECK: 2: foo // CHECK: 3: [B3.2] // CHECK: 4: [B3.3]([B3.1]) -// CHECK: T: [B4.5] && ... +// CHECK: T: [B4.6] && ... // CHECK: Predecessors (2): B5 B4 // CHECK: Successors (2): B2 B1 // CHECK: [ B4 ] @@ -176,7 +176,8 @@ TestCtorInits::TestCtorInits() // CHECK: 3: [B4.2] (BindTemporary) // CHECK: 4: [B4.3].operator _Bool // CHECK: 5: [B4.4]() -// CHECK: T: [B4.5] && ... +// CHECK: 6: [B4.5] +// CHECK: T: [B4.6] && ... // CHECK: Predecessors (2): B6 B7 // CHECK: Successors (2): B5 B3 // CHECK: [ B5 ] @@ -184,6 +185,7 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B5.1] (BindTemporary) // CHECK: 3: [B5.2].operator _Bool // CHECK: 4: [B5.3]() +// CHECK: 5: [B5.4] // CHECK: Predecessors (1): B4 // CHECK: Successors (1): B3 // CHECK: [ B6 ] @@ -191,9 +193,9 @@ TestCtorInits::TestCtorInits() // CHECK: Predecessors (1): B7 // CHECK: Successors (1): B4 // CHECK: [ B7 ] -// CHECK: 1: [B8.4] && [B9.4] +// CHECK: 1: [B8.5] && [B9.5] // CHECK: 2: bool a = A().operator _Bool() && B().operator _Bool(); -// CHECK: T: [B8.4] && ... +// CHECK: T: [B8.5] && ... // CHECK: Predecessors (2): B9 B8 // CHECK: Successors (2): B6 B4 // CHECK: [ B8 ] @@ -201,7 +203,8 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B8.1] (BindTemporary) // CHECK: 3: [B8.2].operator _Bool // CHECK: 4: [B8.3]() -// CHECK: T: [B8.4] && ... +// CHECK: 5: [B8.4] +// CHECK: T: [B8.5] && ... // CHECK: Predecessors (1): B10 // CHECK: Successors (2): B9 B7 // CHECK: [ B9 ] @@ -209,6 +212,7 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B9.1] (BindTemporary) // CHECK: 3: [B9.2].operator _Bool // CHECK: 4: [B9.3]() +// CHECK: 5: [B9.4] // CHECK: Predecessors (1): B8 // CHECK: Successors (1): B7 // CHECK: [ B0 (EXIT) ] @@ -227,11 +231,11 @@ TestCtorInits::TestCtorInits() // CHECK: Predecessors (1): B3 // CHECK: Successors (1): B1 // CHECK: [ B3 ] -// CHECK: 1: [B4.5] || [B5.4] +// CHECK: 1: [B4.6] || [B5.5] // CHECK: 2: foo // CHECK: 3: [B3.2] // CHECK: 4: [B3.3]([B3.1]) -// CHECK: T: [B4.5] || ... +// CHECK: T: [B4.6] || ... // CHECK: Predecessors (2): B5 B4 // CHECK: Successors (2): B1 B2 // CHECK: [ B4 ] @@ -240,7 +244,8 @@ TestCtorInits::TestCtorInits() // CHECK: 3: [B4.2] (BindTemporary) // CHECK: 4: [B4.3].operator _Bool // CHECK: 5: [B4.4]() -// CHECK: T: [B4.5] || ... +// CHECK: 6: [B4.5] +// CHECK: T: [B4.6] || ... // CHECK: Predecessors (2): B6 B7 // CHECK: Successors (2): B3 B5 // CHECK: [ B5 ] @@ -248,6 +253,7 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B5.1] (BindTemporary) // CHECK: 3: [B5.2].operator _Bool // CHECK: 4: [B5.3]() +// CHECK: 5: [B5.4] // CHECK: Predecessors (1): B4 // CHECK: Successors (1): B3 // CHECK: [ B6 ] @@ -255,9 +261,9 @@ TestCtorInits::TestCtorInits() // CHECK: Predecessors (1): B7 // CHECK: Successors (1): B4 // CHECK: [ B7 ] -// CHECK: 1: [B8.4] || [B9.4] +// CHECK: 1: [B8.5] || [B9.5] // CHECK: 2: bool a = A().operator _Bool() || B().operator _Bool(); -// CHECK: T: [B8.4] || ... +// CHECK: T: [B8.5] || ... // CHECK: Predecessors (2): B9 B8 // CHECK: Successors (2): B4 B6 // CHECK: [ B8 ] @@ -265,7 +271,8 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B8.1] (BindTemporary) // CHECK: 3: [B8.2].operator _Bool // CHECK: 4: [B8.3]() -// CHECK: T: [B8.4] || ... +// CHECK: 5: [B8.4] +// CHECK: T: [B8.5] || ... // CHECK: Predecessors (1): B10 // CHECK: Successors (2): B7 B9 // CHECK: [ B9 ] @@ -273,6 +280,7 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B9.1] (BindTemporary) // CHECK: 3: [B9.2].operator _Bool // CHECK: 4: [B9.3]() +// CHECK: 5: [B9.4] // CHECK: Predecessors (1): B8 // CHECK: Successors (1): B7 // CHECK: [ B0 (EXIT) ] @@ -306,8 +314,9 @@ TestCtorInits::TestCtorInits() // CHECK: 3: [B4.2] (BindTemporary) // CHECK: 4: [B4.3].operator _Bool // CHECK: 5: [B4.4]() -// CHECK: 6: ~B() (Temporary object destructor) -// CHECK: T: if [B4.5] +// CHECK: 6: [B4.5] +// CHECK: 7: ~B() (Temporary object destructor) +// CHECK: T: if [B4.6] // CHECK: Predecessors (2): B5 B6 // CHECK: Successors (2): B3 B2 // CHECK: [ B5 ] @@ -323,11 +332,11 @@ TestCtorInits::TestCtorInits() // CHECK: Predecessors (1): B7 // CHECK: Successors (1): B4 // CHECK: [ B7 ] -// CHECK: 1: [B10.4] ? [B8.5] : [B9.13] +// CHECK: 1: [B10.5] ? [B8.5] : [B9.13] // CHECK: 2: [B7.1] // CHECK: 3: [B7.2] // CHECK: 4: A a = B().operator _Bool() ? A() : A(B().operator A()); -// CHECK: T: [B10.4] ? ... : ... +// CHECK: T: [B10.5] ? ... : ... // CHECK: Predecessors (2): B8 B9 // CHECK: Successors (2): B5 B6 // CHECK: [ B8 ] @@ -343,8 +352,8 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B9.1] (BindTemporary) // CHECK: 3: [B9.2].operator A // CHECK: 4: [B9.3]() -// CHECK: 5: [B9.4] (BindTemporary) -// CHECK: 6: [B9.5] +// CHECK: 5: [B9.4] +// CHECK: 6: [B9.5] (BindTemporary) // CHECK: 7: [B9.6] // CHECK: 8: [B9.7] // CHECK: 9: [B9.8] (BindTemporary) @@ -359,7 +368,8 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B10.1] (BindTemporary) // CHECK: 3: [B10.2].operator _Bool // CHECK: 4: [B10.3]() -// CHECK: T: [B10.4] ? ... : ... +// CHECK: 5: [B10.4] +// CHECK: T: [B10.5] ? ... : ... // CHECK: Predecessors (1): B11 // CHECK: Successors (2): B8 B9 // CHECK: [ B0 (EXIT) ] @@ -387,13 +397,13 @@ TestCtorInits::TestCtorInits() // CHECK: Predecessors (1): B4 // CHECK: Successors (1): B1 // CHECK: [ B4 ] -// CHECK: 1: [B7.5] ? [B5.5] : [B6.13] +// CHECK: 1: [B7.6] ? [B5.5] : [B6.13] // CHECK: 2: [B4.1] // CHECK: 3: [B4.2] // CHECK: 4: foo // CHECK: 5: [B4.4] // CHECK: 6: [B4.5]([B4.3]) -// CHECK: T: [B7.5] ? ... : ... +// CHECK: T: [B7.6] ? ... : ... // CHECK: Predecessors (2): B5 B6 // CHECK: Successors (2): B2 B3 // CHECK: [ B5 ] @@ -409,8 +419,8 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B6.1] (BindTemporary) // CHECK: 3: [B6.2].operator A // CHECK: 4: [B6.3]() -// CHECK: 5: [B6.4] (BindTemporary) -// CHECK: 6: [B6.5] +// CHECK: 5: [B6.4] +// CHECK: 6: [B6.5] (BindTemporary) // CHECK: 7: [B6.6] // CHECK: 8: [B6.7] // CHECK: 9: [B6.8] (BindTemporary) @@ -426,7 +436,8 @@ TestCtorInits::TestCtorInits() // CHECK: 3: [B7.2] (BindTemporary) // CHECK: 4: [B7.3].operator _Bool // CHECK: 5: [B7.4]() -// CHECK: T: [B7.5] ? ... : ... +// CHECK: 6: [B7.5] +// CHECK: T: [B7.6] ? ... : ... // CHECK: Predecessors (2): B8 B9 // CHECK: Successors (2): B5 B6 // CHECK: [ B8 ] @@ -440,11 +451,11 @@ TestCtorInits::TestCtorInits() // CHECK: Predecessors (1): B10 // CHECK: Successors (1): B7 // CHECK: [ B10 ] -// CHECK: 1: [B13.4] ? [B11.5] : [B12.13] +// CHECK: 1: [B13.5] ? [B11.5] : [B12.13] // CHECK: 2: [B10.1] // CHECK: 3: [B10.2] // CHECK: 4: const A &a = B().operator _Bool() ? A() : A(B().operator A()); -// CHECK: T: [B13.4] ? ... : ... +// CHECK: T: [B13.5] ? ... : ... // CHECK: Predecessors (2): B11 B12 // CHECK: Successors (2): B8 B9 // CHECK: [ B11 ] @@ -460,8 +471,8 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B12.1] (BindTemporary) // CHECK: 3: [B12.2].operator A // CHECK: 4: [B12.3]() -// CHECK: 5: [B12.4] (BindTemporary) -// CHECK: 6: [B12.5] +// CHECK: 5: [B12.4] +// CHECK: 6: [B12.5] (BindTemporary) // CHECK: 7: [B12.6] // CHECK: 8: [B12.7] // CHECK: 9: [B12.8] (BindTemporary) @@ -476,7 +487,8 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B13.1] (BindTemporary) // CHECK: 3: [B13.2].operator _Bool // CHECK: 4: [B13.3]() -// CHECK: T: [B13.4] ? ... : ... +// CHECK: 5: [B13.4] +// CHECK: T: [B13.5] ? ... : ... // CHECK: Predecessors (1): B14 // CHECK: Successors (2): B11 B12 // CHECK: [ B0 (EXIT) ] @@ -505,7 +517,7 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B4.1] // CHECK: 3: [B4.2] // CHECK: 4: A a = A() ?: A(); -// CHECK: T: [B7.4] ? ... : ... +// CHECK: T: [B7.5] ? ... : ... // CHECK: Predecessors (2): B5 B6 // CHECK: Successors (2): B2 B3 // CHECK: [ B5 ] @@ -528,7 +540,8 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B7.1] (BindTemporary) // CHECK: 3: .operator _Bool // CHECK: 4: [B7.3]() -// CHECK: T: [B7.4] ? ... : ... +// CHECK: 5: [B7.4] +// CHECK: T: [B7.5] ? ... : ... // CHECK: Predecessors (1): B8 // CHECK: Successors (2): B5 B6 // CHECK: [ B0 (EXIT) ] @@ -559,7 +572,7 @@ TestCtorInits::TestCtorInits() // CHECK: 4: foo // CHECK: 5: [B4.4] // CHECK: 6: [B4.5]([B4.3]) -// CHECK: T: [B7.5] ? ... : ... +// CHECK: T: [B7.6] ? ... : ... // CHECK: Predecessors (2): B5 B6 // CHECK: Successors (2): B2 B3 // CHECK: [ B5 ] @@ -583,7 +596,8 @@ TestCtorInits::TestCtorInits() // CHECK: 3: [B7.2] (BindTemporary) // CHECK: 4: .operator _Bool // CHECK: 5: [B7.4]() -// CHECK: T: [B7.5] ? ... : ... +// CHECK: 6: [B7.5] +// CHECK: T: [B7.6] ? ... : ... // CHECK: Predecessors (2): B9 B8 // CHECK: Successors (2): B5 B6 // CHECK: [ B8 ] @@ -595,7 +609,7 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B9.1] // CHECK: 3: [B9.2] // CHECK: 4: const A &a = A() ?: A(); -// CHECK: T: [B12.4] ? ... : ... +// CHECK: T: [B12.5] ? ... : ... // CHECK: Predecessors (2): B10 B11 // CHECK: Successors (2): B7 B8 // CHECK: [ B10 ] @@ -618,7 +632,8 @@ TestCtorInits::TestCtorInits() // CHECK: 2: [B12.1] (BindTemporary) // CHECK: 3: .operator _Bool // CHECK: 4: [B12.3]() -// CHECK: T: [B12.4] ? ... : ... +// CHECK: 5: [B12.4] +// CHECK: T: [B12.5] ? ... : ... // CHECK: Predecessors (1): B13 // CHECK: Successors (2): B10 B11 // CHECK: [ B0 (EXIT) ] @@ -721,10 +736,11 @@ TestCtorInits::TestCtorInits() // CHECK: 3: [B1.2] (BindTemporary) // CHECK: 4: [B1.3].operator int // CHECK: 5: [B1.4]() -// CHECK: 6: a -// CHECK: 7: [B1.6] = [B1.5] -// CHECK: 8: ~A() (Temporary object destructor) -// CHECK: 9: int b; +// CHECK: 6: [B1.5] +// CHECK: 7: a +// CHECK: 8: [B1.7] = [B1.6] +// CHECK: 9: ~A() (Temporary object destructor) +// CHECK: 10: int b; // CHECK: Predecessors (1): B2 // CHECK: Successors (1): B0 // CHECK: [ B0 (EXIT) ] @@ -757,5 +773,3 @@ TestCtorInits::TestCtorInits() // CHECK: [ B0 (EXIT) ] // CHECK: Predecessors (1): B1 // CHECK: Successors (0): - -