@@ -21,7 +21,7 @@ import dmd.aggregate;
21
21
import dmd.arraytypes;
22
22
import dmd.astenums;
23
23
import dmd.ast_node;
24
- import dmd.dcast : implicitConvTo;
24
+ import dmd.dcast : implicitConvTo /* toStringExp */ ;
25
25
import dmd.dclass;
26
26
import dmd.declaration;
27
27
import dmd.dimport;
@@ -49,7 +49,7 @@ import dmd.root.string;
49
49
import dmd.root.utf;
50
50
import dmd.target;
51
51
import dmd.tokens;
52
- import dmd.typesem : toHeadMutable, size, mutableOf, unSharedOf ;
52
+ import dmd.typesem : toHeadMutable, size /* getFieldIndex */ ;
53
53
import dmd.visitor;
54
54
55
55
enum LOGSEMANTIC = false ;
@@ -506,14 +506,6 @@ extern (C++) abstract class Expression : ASTNode
506
506
return null ;
507
507
}
508
508
509
- /* **************************************
510
- * Return !=0 if expression is an lvalue.
511
- */
512
- bool isLvalue ()
513
- {
514
- return false ;
515
- }
516
-
517
509
/* ***************************************
518
510
* Check that the expression has a valid type.
519
511
* If not, generates an error "... has no type".
@@ -1197,11 +1189,6 @@ extern (C++) class IdentifierExp : Expression
1197
1189
return new IdentifierExp(loc, ident);
1198
1190
}
1199
1191
1200
- override final bool isLvalue ()
1201
- {
1202
- return ! this .rvalue;
1203
- }
1204
-
1205
1192
override void accept (Visitor v)
1206
1193
{
1207
1194
v.visit(this );
@@ -1241,11 +1228,6 @@ extern (C++) final class DsymbolExp : Expression
1241
1228
this .hasOverloads = hasOverloads;
1242
1229
}
1243
1230
1244
- override bool isLvalue ()
1245
- {
1246
- return ! rvalue;
1247
- }
1248
-
1249
1231
override void accept (Visitor v)
1250
1232
{
1251
1233
v.visit(this );
@@ -1286,12 +1268,6 @@ extern (C++) class ThisExp : Expression
1286
1268
return typeof (return )(true );
1287
1269
}
1288
1270
1289
- override final bool isLvalue ()
1290
- {
1291
- // Class `this` should be an rvalue; struct `this` should be an lvalue.
1292
- return ! rvalue && type.toBasetype().ty != Tclass;
1293
- }
1294
-
1295
1271
override void accept (Visitor v)
1296
1272
{
1297
1273
v.visit(this );
@@ -1672,14 +1648,6 @@ extern (C++) final class StringExp : Expression
1672
1648
return typeof (return )(true );
1673
1649
}
1674
1650
1675
- override bool isLvalue ()
1676
- {
1677
- /* string literal is rvalue in default, but
1678
- * conversion to reference of static array is only allowed.
1679
- */
1680
- return ! rvalue && (type && type.toBasetype().ty == Tsarray);
1681
- }
1682
-
1683
1651
/* *******************************
1684
1652
* Convert string contents to a 0 terminated string,
1685
1653
* allocated by mem.xmalloc().
@@ -2361,11 +2329,6 @@ extern (C++) final class TemplateExp : Expression
2361
2329
this .fd = fd;
2362
2330
}
2363
2331
2364
- override bool isLvalue ()
2365
- {
2366
- return fd ! is null ;
2367
- }
2368
-
2369
2332
override bool checkType ()
2370
2333
{
2371
2334
error(loc, " %s `%s` has no type" , td.kind(), toChars());
@@ -2558,13 +2521,6 @@ extern (C++) final class VarExp : SymbolExp
2558
2521
return false ;
2559
2522
}
2560
2523
2561
- override bool isLvalue ()
2562
- {
2563
- if (rvalue || var.storage_class & (STC .lazy_ | STC .rvalue | STC .manifest))
2564
- return false ;
2565
- return true ;
2566
- }
2567
-
2568
2524
override void accept (Visitor v)
2569
2525
{
2570
2526
v.visit(this );
@@ -2586,11 +2542,6 @@ extern (C++) final class OverExp : Expression
2586
2542
type = Type.tvoid;
2587
2543
}
2588
2544
2589
- override bool isLvalue ()
2590
- {
2591
- return true ;
2592
- }
2593
-
2594
2545
override void accept (Visitor v)
2595
2546
{
2596
2547
v.visit(this );
@@ -2906,11 +2857,6 @@ extern (C++) class BinAssignExp : BinExp
2906
2857
super (loc, op, e1, e2);
2907
2858
}
2908
2859
2909
- override final bool isLvalue ()
2910
- {
2911
- return ! rvalue;
2912
- }
2913
-
2914
2860
override void accept (Visitor v)
2915
2861
{
2916
2862
v.visit(this );
@@ -3104,16 +3050,6 @@ extern (C++) final class DotVarExp : UnaExp
3104
3050
this .hasOverloads = hasOverloads;
3105
3051
}
3106
3052
3107
- override bool isLvalue ()
3108
- {
3109
- if (rvalue)
3110
- return false ;
3111
- if (e1.op != EXP .structLiteral)
3112
- return true ;
3113
- auto vd = var.isVarDeclaration();
3114
- return ! (vd && vd.isField());
3115
- }
3116
-
3117
3053
override void accept (Visitor v)
3118
3054
{
3119
3055
v.visit(this );
@@ -3328,24 +3264,6 @@ extern (C++) final class CallExp : UnaExp
3328
3264
return new CallExp(loc, e1.syntaxCopy(), arraySyntaxCopy(arguments), names ? names.copy() : null );
3329
3265
}
3330
3266
3331
- override bool isLvalue ()
3332
- {
3333
- if (rvalue)
3334
- return false ;
3335
- Type tb = e1.type.toBasetype();
3336
- if (tb.ty == Tdelegate || tb.ty == Tpointer)
3337
- tb = tb.nextOf();
3338
- auto tf = tb.isTypeFunction();
3339
- if (tf && tf.isRef)
3340
- {
3341
- if (auto dve = e1.isDotVarExp())
3342
- if (dve.var.isCtorDeclaration())
3343
- return false ;
3344
- return true ; // function returns a reference
3345
- }
3346
- return false ;
3347
- }
3348
-
3349
3267
override void accept (Visitor v)
3350
3268
{
3351
3269
v.visit(this );
@@ -3447,11 +3365,6 @@ extern (C++) final class PtrExp : UnaExp
3447
3365
type = t;
3448
3366
}
3449
3367
3450
- override bool isLvalue ()
3451
- {
3452
- return ! rvalue;
3453
- }
3454
-
3455
3368
override void accept (Visitor v)
3456
3369
{
3457
3370
v.visit(this );
@@ -3576,16 +3489,6 @@ extern (C++) final class CastExp : UnaExp
3576
3489
return to ? new CastExp(loc, e1.syntaxCopy(), to.syntaxCopy()) : new CastExp(loc, e1.syntaxCopy(), mod);
3577
3490
}
3578
3491
3579
- override bool isLvalue ()
3580
- {
3581
- // printf("e1.type = %s, to.type = %s\n", e1.type.toChars(), to.toChars());
3582
- if (rvalue || ! e1.isLvalue())
3583
- return false ;
3584
- return (to.ty == Tsarray && (e1.type.ty == Tvector || e1.type.ty == Tsarray)) ||
3585
- (to.ty == Taarray && e1.type.ty == Taarray) ||
3586
- e1.type.mutableOf.unSharedOf().equals(to.mutableOf().unSharedOf());
3587
- }
3588
-
3589
3492
override void accept (Visitor v)
3590
3493
{
3591
3494
v.visit(this );
@@ -3635,11 +3538,6 @@ extern (C++) final class VectorArrayExp : UnaExp
3635
3538
super (loc, EXP .vectorArray, e1);
3636
3539
}
3637
3540
3638
- override bool isLvalue ()
3639
- {
3640
- return ! rvalue && e1.isLvalue();
3641
- }
3642
-
3643
3541
override void accept (Visitor v)
3644
3542
{
3645
3543
v.visit(this );
@@ -3689,14 +3587,6 @@ extern (C++) final class SliceExp : UnaExp
3689
3587
return se;
3690
3588
}
3691
3589
3692
- override bool isLvalue ()
3693
- {
3694
- /* slice expression is rvalue in default, but
3695
- * conversion to reference of static array is only allowed.
3696
- */
3697
- return ! rvalue && (type && type.toBasetype().ty == Tsarray);
3698
- }
3699
-
3700
3590
override Optional! bool toBool ()
3701
3591
{
3702
3592
return e1.toBool();
@@ -3757,15 +3647,6 @@ extern (C++) final class ArrayExp : UnaExp
3757
3647
return ae;
3758
3648
}
3759
3649
3760
- override bool isLvalue ()
3761
- {
3762
- if (rvalue)
3763
- return false ;
3764
- if (type && type.toBasetype().ty == Tvoid)
3765
- return false ;
3766
- return true ;
3767
- }
3768
-
3769
3650
override void accept (Visitor v)
3770
3651
{
3771
3652
v.visit(this );
@@ -3817,11 +3698,6 @@ extern (C++) final class CommaExp : BinExp
3817
3698
originalExp = oe;
3818
3699
}
3819
3700
3820
- override bool isLvalue ()
3821
- {
3822
- return ! rvalue && e2.isLvalue();
3823
- }
3824
-
3825
3701
override Optional! bool toBool ()
3826
3702
{
3827
3703
return e2.toBool();
@@ -3892,11 +3768,6 @@ extern (C++) final class DelegatePtrExp : UnaExp
3892
3768
super (loc, EXP .delegatePointer, e1);
3893
3769
}
3894
3770
3895
- override bool isLvalue ()
3896
- {
3897
- return ! rvalue && e1.isLvalue();
3898
- }
3899
-
3900
3771
override void accept (Visitor v)
3901
3772
{
3902
3773
v.visit(this );
@@ -3915,11 +3786,6 @@ extern (C++) final class DelegateFuncptrExp : UnaExp
3915
3786
super (loc, EXP .delegateFunctionPointer, e1);
3916
3787
}
3917
3788
3918
- override bool isLvalue ()
3919
- {
3920
- return ! rvalue && e1.isLvalue();
3921
- }
3922
-
3923
3789
override void accept (Visitor v)
3924
3790
{
3925
3791
v.visit(this );
@@ -3955,19 +3821,6 @@ extern (C++) final class IndexExp : BinExp
3955
3821
return ie;
3956
3822
}
3957
3823
3958
- override bool isLvalue ()
3959
- {
3960
- if (rvalue)
3961
- return false ;
3962
- auto t1b = e1.type.toBasetype();
3963
- if (t1b.isTypeAArray() || t1b.isTypeSArray() ||
3964
- (e1.isIndexExp() && t1b != t1b.isTypeDArray()))
3965
- {
3966
- return e1.isLvalue();
3967
- }
3968
- return true ;
3969
- }
3970
-
3971
3824
override void accept (Visitor v)
3972
3825
{
3973
3826
v.visit(this );
@@ -4036,17 +3889,6 @@ extern (C++) class AssignExp : BinExp
4036
3889
super (loc, tok, e1, e2);
4037
3890
}
4038
3891
4039
- override final bool isLvalue ()
4040
- {
4041
- // Array-op 'x[] = y[]' should make an rvalue.
4042
- // Setting array length 'x.length = v' should make an rvalue.
4043
- if (e1.op == EXP .slice || e1.op == EXP .arrayLength)
4044
- {
4045
- return false ;
4046
- }
4047
- return ! rvalue;
4048
- }
4049
-
4050
3892
override void accept (Visitor v)
4051
3893
{
4052
3894
v.visit(this );
@@ -4770,11 +4612,6 @@ extern (C++) final class CondExp : BinExp
4770
4612
return new CondExp(loc, econd.syntaxCopy(), e1.syntaxCopy(), e2.syntaxCopy());
4771
4613
}
4772
4614
4773
- override bool isLvalue ()
4774
- {
4775
- return ! rvalue && e1.isLvalue() && e2.isLvalue();
4776
- }
4777
-
4778
4615
override void accept (Visitor v)
4779
4616
{
4780
4617
v.visit(this );
0 commit comments