parent
0c505b08a5
commit
3e7743ed2c
|
@ -8630,19 +8630,19 @@ static bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {
|
|||
if (IsLV == Expr::MLV_Valid)
|
||||
return false;
|
||||
|
||||
unsigned Diag = 0;
|
||||
unsigned DiagID = 0;
|
||||
bool NeedType = false;
|
||||
switch (IsLV) { // C99 6.5.16p2
|
||||
case Expr::MLV_ConstQualified:
|
||||
Diag = diag::err_typecheck_assign_const;
|
||||
DiagID = diag::err_typecheck_assign_const;
|
||||
|
||||
// Use a specialized diagnostic when we're assigning to an object
|
||||
// from an enclosing function or block.
|
||||
if (NonConstCaptureKind NCCK = isReferenceToNonConstCapture(S, E)) {
|
||||
if (NCCK == NCCK_Block)
|
||||
Diag = diag::err_block_decl_ref_not_modifiable_lvalue;
|
||||
DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
|
||||
else
|
||||
Diag = diag::err_lambda_decl_ref_not_modifiable_lvalue;
|
||||
DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -8662,18 +8662,18 @@ static bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {
|
|||
// - self
|
||||
ObjCMethodDecl *method = S.getCurMethodDecl();
|
||||
if (method && var == method->getSelfDecl())
|
||||
Diag = method->isClassMethod()
|
||||
DiagID = method->isClassMethod()
|
||||
? diag::err_typecheck_arc_assign_self_class_method
|
||||
: diag::err_typecheck_arc_assign_self;
|
||||
|
||||
// - fast enumeration variables
|
||||
else
|
||||
Diag = diag::err_typecheck_arr_assign_enumeration;
|
||||
DiagID = diag::err_typecheck_arr_assign_enumeration;
|
||||
|
||||
SourceRange Assign;
|
||||
if (Loc != OrigLoc)
|
||||
Assign = SourceRange(OrigLoc, OrigLoc);
|
||||
S.Diag(Loc, Diag) << E->getSourceRange() << Assign;
|
||||
S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
|
||||
// We need to preserve the AST regardless, so migration tool
|
||||
// can do its job.
|
||||
return false;
|
||||
|
@ -8684,37 +8684,37 @@ static bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {
|
|||
break;
|
||||
case Expr::MLV_ArrayType:
|
||||
case Expr::MLV_ArrayTemporary:
|
||||
Diag = diag::err_typecheck_array_not_modifiable_lvalue;
|
||||
DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
|
||||
NeedType = true;
|
||||
break;
|
||||
case Expr::MLV_NotObjectType:
|
||||
Diag = diag::err_typecheck_non_object_not_modifiable_lvalue;
|
||||
DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
|
||||
NeedType = true;
|
||||
break;
|
||||
case Expr::MLV_LValueCast:
|
||||
Diag = diag::err_typecheck_lvalue_casts_not_supported;
|
||||
DiagID = diag::err_typecheck_lvalue_casts_not_supported;
|
||||
break;
|
||||
case Expr::MLV_Valid:
|
||||
llvm_unreachable("did not take early return for MLV_Valid");
|
||||
case Expr::MLV_InvalidExpression:
|
||||
case Expr::MLV_MemberFunction:
|
||||
case Expr::MLV_ClassTemporary:
|
||||
Diag = diag::err_typecheck_expression_not_modifiable_lvalue;
|
||||
DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
|
||||
break;
|
||||
case Expr::MLV_IncompleteType:
|
||||
case Expr::MLV_IncompleteVoidType:
|
||||
return S.RequireCompleteType(Loc, E->getType(),
|
||||
diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);
|
||||
case Expr::MLV_DuplicateVectorComponents:
|
||||
Diag = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
|
||||
DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
|
||||
break;
|
||||
case Expr::MLV_NoSetterProperty:
|
||||
llvm_unreachable("readonly properties should be processed differently");
|
||||
case Expr::MLV_InvalidMessageExpression:
|
||||
Diag = diag::error_readonly_message_assignment;
|
||||
DiagID = diag::error_readonly_message_assignment;
|
||||
break;
|
||||
case Expr::MLV_SubObjCPropertySetting:
|
||||
Diag = diag::error_no_subobject_property_setting;
|
||||
DiagID = diag::error_no_subobject_property_setting;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -8722,9 +8722,9 @@ static bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {
|
|||
if (Loc != OrigLoc)
|
||||
Assign = SourceRange(OrigLoc, OrigLoc);
|
||||
if (NeedType)
|
||||
S.Diag(Loc, Diag) << E->getType() << E->getSourceRange() << Assign;
|
||||
S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
|
||||
else
|
||||
S.Diag(Loc, Diag) << E->getSourceRange() << Assign;
|
||||
S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue