@@ -2307,7 +2307,10 @@ Expr* SemanticsVisitor::CheckSimpleSubscriptExpr(IndexExpr* subscriptExpr, Type*
2307
2307
Expr* SemanticsExprVisitor::visitIndexExpr (IndexExpr* subscriptExpr)
2308
2308
{
2309
2309
bool needDeref = false ;
2310
- auto baseExpr = checkBaseForMemberExpr (subscriptExpr->baseExpression , needDeref);
2310
+ auto baseExpr = checkBaseForMemberExpr (
2311
+ subscriptExpr->baseExpression ,
2312
+ CheckBaseContext::Subscript,
2313
+ needDeref);
2311
2314
2312
2315
// If the base expression is a type, it means that this is an array declaration,
2313
2316
// then we should disable short-circuit in case there is logical expression in
@@ -2951,7 +2954,10 @@ Expr* SemanticsExprVisitor::visitInvokeExpr(InvokeExpr* expr)
2951
2954
auto operatorName = getName (" ()" );
2952
2955
2953
2956
bool needDeref = false ;
2954
- expr->functionExpr = maybeInsertImplicitOpForMemberBase (expr->functionExpr , needDeref);
2957
+ expr->functionExpr = maybeInsertImplicitOpForMemberBase (
2958
+ expr->functionExpr ,
2959
+ CheckBaseContext::Member,
2960
+ needDeref);
2955
2961
2956
2962
LookupResult lookupResult = lookUpMember (
2957
2963
m_astBuilder,
@@ -4060,27 +4066,36 @@ void SemanticsExprVisitor::maybeCheckKnownBuiltinInvocation(Expr* invokeExpr)
4060
4066
}
4061
4067
}
4062
4068
4063
- Expr* SemanticsVisitor::MaybeDereference (Expr* inExpr)
4069
+ Expr* SemanticsVisitor::maybeDereference (Expr* inExpr, CheckBaseContext checkBaseContext )
4064
4070
{
4065
4071
Expr* expr = inExpr;
4066
4072
for (;;)
4067
4073
{
4068
4074
auto baseType = expr->type ;
4075
+ QualType elementType;
4069
4076
if (auto pointerLikeType = as<PointerLikeType>(baseType))
4070
4077
{
4071
- auto elementType = QualType (pointerLikeType->getElementType ());
4078
+ elementType = QualType (pointerLikeType->getElementType ());
4072
4079
elementType.isLeftValue = baseType.isLeftValue ;
4073
4080
elementType.hasReadOnlyOnTarget = baseType.hasReadOnlyOnTarget ;
4074
4081
elementType.isWriteOnly = baseType.isWriteOnly ;
4075
-
4082
+ }
4083
+ else if (auto ptrType = as<PtrType>(baseType))
4084
+ {
4085
+ if (checkBaseContext == CheckBaseContext::Subscript)
4086
+ return expr;
4087
+ elementType = QualType (ptrType->getValueType ());
4088
+ elementType.isLeftValue = true ;
4089
+ }
4090
+ if (elementType.type )
4091
+ {
4076
4092
auto derefExpr = m_astBuilder->create <DerefExpr>();
4077
4093
derefExpr->base = expr;
4078
4094
derefExpr->type = elementType;
4079
4095
4080
4096
expr = derefExpr;
4081
4097
continue ;
4082
4098
}
4083
-
4084
4099
// Default case: just use the expression as-is
4085
4100
return expr;
4086
4101
}
@@ -4751,7 +4766,7 @@ Expr* SemanticsExprVisitor::visitStaticMemberExpr(StaticMemberExpr* expr)
4751
4766
expr->baseExpression = CheckTerm (expr->baseExpression );
4752
4767
4753
4768
// Not sure this is needed -> but guess someone could do
4754
- expr->baseExpression = MaybeDereference (expr->baseExpression );
4769
+ expr->baseExpression = maybeDereference (expr->baseExpression , CheckBaseContext::Member );
4755
4770
4756
4771
// If the base of the member lookup has an interface type
4757
4772
// *without* a suitable this-type substitution, then we are
@@ -4779,9 +4794,12 @@ Expr* SemanticsVisitor::lookupMemberResultFailure(
4779
4794
return expr;
4780
4795
}
4781
4796
4782
- Expr* SemanticsVisitor::maybeInsertImplicitOpForMemberBase (Expr* baseExpr, bool & outNeedDeref)
4797
+ Expr* SemanticsVisitor::maybeInsertImplicitOpForMemberBase (
4798
+ Expr* baseExpr,
4799
+ CheckBaseContext checkBaseContext,
4800
+ bool & outNeedDeref)
4783
4801
{
4784
- auto derefExpr = MaybeDereference (baseExpr);
4802
+ auto derefExpr = maybeDereference (baseExpr, checkBaseContext );
4785
4803
4786
4804
if (derefExpr != baseExpr)
4787
4805
outNeedDeref = true ;
@@ -4834,11 +4852,15 @@ Expr* SemanticsVisitor::maybeInsertImplicitOpForMemberBase(Expr* baseExpr, bool&
4834
4852
return baseExpr;
4835
4853
}
4836
4854
4837
- Expr* SemanticsVisitor::checkBaseForMemberExpr (Expr* inBaseExpr, bool & outNeedDeref)
4855
+ Expr* SemanticsVisitor::checkBaseForMemberExpr (
4856
+ Expr* inBaseExpr,
4857
+ CheckBaseContext checkBaseContext,
4858
+ bool & outNeedDeref)
4838
4859
{
4839
4860
auto baseExpr = inBaseExpr;
4840
4861
baseExpr = CheckTerm (baseExpr);
4841
- return maybeInsertImplicitOpForMemberBase (baseExpr, outNeedDeref);
4862
+
4863
+ return maybeInsertImplicitOpForMemberBase (baseExpr, checkBaseContext, outNeedDeref);
4842
4864
}
4843
4865
4844
4866
Expr* SemanticsVisitor::checkGeneralMemberLookupExpr (MemberExpr* expr, Type* baseType)
@@ -4861,7 +4883,8 @@ Expr* SemanticsVisitor::checkGeneralMemberLookupExpr(MemberExpr* expr, Type* bas
4861
4883
Expr* SemanticsExprVisitor::visitMemberExpr (MemberExpr* expr)
4862
4884
{
4863
4885
bool needDeref = false ;
4864
- expr->baseExpression = checkBaseForMemberExpr (expr->baseExpression , needDeref);
4886
+ expr->baseExpression =
4887
+ checkBaseForMemberExpr (expr->baseExpression , CheckBaseContext::Member, needDeref);
4865
4888
4866
4889
if (!needDeref && as<DerefMemberExpr>(expr) && !as<PtrType>(expr->baseExpression ->type ))
4867
4890
{
0 commit comments