Bug 20934 – preview=dtorfields segfaults for disabled/extern constructors
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2020-06-15T16:44:33Z
Last change time
2020-09-01T02:39:55Z
Assigned to
No Owner
Creator
moonlightsentinel
Comments
Comment #0 by moonlightsentinel — 2020-06-15T16:44:33Z
This code segfaults when compiled with -preview=dtorfields:
=========================
struct Array
{
~this() {}
}
struct CyclicArray()
{
Array array;
@disable this();
}
auto heapArray = CyclicArray!()();
=========================
dmd -c -o- cyclic_array.d
cyclic_array.d(12): Error: constructor cyclic_array.CyclicArray!().CyclicArray.this cannot be used because it is annotated with @disable
cyclic_array.d(12): Error: this cannot be interpreted at compile time, because it has no available source code
dmd -c -o- preview=dtorfields cyclic_array.d
Segmentation fault (core dumped)
Running in gdb shows that it tries to do semantic analysis on the missing body of CyclicArrays disabled dtor:
gdb generated/linux/debug/64/dmd -batch -ex "run -c -o- -preview=dtorfields cyclic_array.d" -ex "bt" &> gdb.log
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x0000000008182b6c in Statement::isCompoundStatement() (this=0x0) at src/dmd/statement.d:424
424 inout(CompoundStatement) isCompoundStatement() { return stmt == STMT.Compound ? cast(typeof(return))this : null; }
#0 0x0000000008182b6c in Statement::isCompoundStatement() (this=0x0) at src/dmd/statement.d:424
#1 0x00000000081c0b29 in _D3dmd12statementsem15semanticNoScopeFCQBl9statement9StatementPSQCk6dscope5ScopeZQBr (s=0x0, sc=0x7ffffddea4b0) at src/dmd/statementsem.d:4318
#2 0x00000000081c0397 in _D3dmd12statementsem13semanticScopeFCQBj9statement9StatementPSQCi6dscope5ScopeQBqQBtZQBx (s=0x0, sc=0x7ffffdde98b0, sbreak=0x0, scontinue=0x0) at src/dmd/statementsem.d:4336
#3 0x00000000081daa78 in StatementSemanticVisitor::visit(TryCatchStatement*) (this=0x7ffffffe90d0, tcs=0x7ffffdde9ef0) at src/dmd/statementsem.d:3826
#4 0x00000000081ec243 in TryCatchStatement::accept(Visitor*) (this=0x7ffffdde9ef0, v=0x7ffffffe90d0) at src/dmd/statement.d:1980
#5 0x0000000008131bf3 in statementSemantic(Statement*, Scope*) (s=0x7ffffdde9ef0, sc=0x7ffffdde98b0) at src/dmd/statementsem.d:127
#6 0x00000000081f0fae in Semantic3Visitor::visit(FuncDeclaration*) (this=0x7ffffffea368, funcdecl=0x7ffffdde7750) at src/dmd/semantic3.d:577
#7 0x00000000081faeee in Semantic3Visitor::visit(CtorDeclaration*) (this=0x7ffffffea368, ctor=0x7ffffdde7750) at src/dmd/semantic3.d:1407
#8 0x00000000082a3563 in CtorDeclaration::accept(Visitor*) (this=0x7ffffdde7750, v=0x7ffffffea368) at src/dmd/func.d:3545
#9 0x000000000819131b in semantic3(Dsymbol*, Scope*) (dsym=0x7ffffdde7750, sc=0x7ffffdde80d0) at src/dmd/semantic3.d:81
#10 0x0000000008286706 in FuncDeclaration::functionSemantic3() (this=0x7ffffdde7750) at src/dmd/func.d:455
#11 0x000000000816cd46 in FuncDeclaration::functionSemantic() (this=0x7ffffdde7750) at src/dmd/func.d:429
#12 0x00000000082cdde2 in ExpressionSemanticVisitor::visit(DotVarExp*) (this=0x7ffffffea6a0, exp=0x7ffffdde9b00) at src/dmd/expressionsem.d:6212
#13 0x00000000082f5ce3 in DotVarExp::accept(Visitor*) (this=0x7ffffdde9b00, v=0x7ffffffea6a0) at src/dmd/expression.d:4713
#14 0x00000000081313d3 in expressionSemantic(Expression*, Scope*) (e=0x7ffffdde9b00, sc=0x7fffff6b7d40) at src/dmd/expressionsem.d:11391
#15 0x00000000082c5a21 in _D3dmd13expressionsem11unaSemanticFCQBi10expression6UnaExpPSQCg6dscope5ScopeZCQCyQBq10Expression (e=0x7ffffdde9b50, sc=0x7fffff6b7d40) at src/dmd/expressionsem.d:11337
#16 0x00000000082c0699 in ExpressionSemanticVisitor::visit(CallExp*) (this=0x7ffffffeb760, exp=0x7ffffdde9b50) at src/dmd/expressionsem.d:4311
#17 0x00000000082f5f03 in CallExp::accept(Visitor*) (this=0x7ffffdde9b50, v=0x7ffffffeb760) at src/dmd/expression.d:4970
#18 0x00000000081313d3 in expressionSemantic(Expression*, Scope*) (e=0x7ffffdde9b50, sc=0x7fffff6b7d40) at src/dmd/expressionsem.d:11391
#19 0x00000000082c13fe in ExpressionSemanticVisitor::visit(CallExp*) (this=0x7ffffffec7f0, exp=0x7fffff6b7960) at src/dmd/expressionsem.d:4437
#20 0x00000000082f5f03 in CallExp::accept(Visitor*) (this=0x7fffff6b7960, v=0x7ffffffec7f0) at src/dmd/expression.d:4970
#21 0x00000000081313d3 in expressionSemantic(Expression*, Scope*) (e=0x7fffff6b7960, sc=0x7fffff6b7d40) at src/dmd/expressionsem.d:11391
#22 0x000000000828eff1 in _D3dmd7initsem9inferTypeFCQy4init11InitializerPSQBu6dscope5ScopeZ8visitExpMFCQCxQCa14ExpInitializerZQCx (init=0x7fffff6b79e0) at src/dmd/initsem.d:644
#23 0x000000000828e82c in _D3dmd7initsem9inferTypeFCQy4init11InitializerPSQBu6dscope5ScopeZQBo (init=0x7fffff6b79e0, sc=0x7fffff6b7d40) at src/dmd/initsem.d:702
#24 0x0000000008324dc8 in DsymbolSemanticVisitor::visit(VarDeclaration*) (this=0x7ffffffed308, dsym=0x7fffff6b7a10) at src/dmd/dsymbolsem.d:822
#25 0x000000000838efe3 in VarDeclaration::accept(Visitor*) (this=0x7fffff6b7a10, v=0x7ffffffed308) at src/dmd/declaration.d:1646
#26 0x000000000818d68b in dsymbolSemantic(Dsymbol*, Scope*) (dsym=0x7fffff6b7a10, sc=0x7fffff6b7d40) at src/dmd/dsymbolsem.d:564
#27 0x000000000832cc73 in _D3dmd10dsymbolsem22DsymbolSemanticVisitor5visitMRCQBx7dmodule6ModuleZ__T9__lambda2TCQDf7dsymbol7DsymbolZQBgMFQBaZv (s=0x7fffff6b7a10) at src/dmd/dsymbolsem.d:2258
#28 0x000000000812d7d0 in _D3dmd7dsymbol14foreachDsymbolFPSQBf4root5array__T5ArrayTCQCeQCd7DsymbolZQxMDFQvZvZv (symbols=0x7fffff6b6570, dg=...) at src/dmd/dsymbol.d:98
#29 0x000000000832cbd4 in DsymbolSemanticVisitor::visit(Module*) (this=0x7ffffffed438, m=0x7fffff6b5300) at src/dmd/dsymbolsem.d:2255
#30 0x000000000827abb3 in Module::accept(Visitor*) (this=0x7fffff6b5300, v=0x7ffffffed438) at src/dmd/dmodule.d:1464
#31 0x000000000818d68b in dsymbolSemantic(Dsymbol*, Scope*) (dsym=0x7fffff6b5300, sc=0x0) at src/dmd/dsymbolsem.d:564
#32 0x0000000008258076 in _D3dmd4mars7tryMainFmPPxaKSQz7globals5ParamZi (argc=5, argv=0x7ffffffee008, params=...) at src/dmd/mars.d:564
#33 0x00000000082641a2 in D main (_param_0=...) at src/dmd/mars.d:950
Comment #1 by moonlightsentinel — 2020-08-31T14:52:32Z
Templates are unnecessary, it's only required to contain a body-less constructor declaration
Comment #2 by dlang-bot — 2020-09-01T02:39:55Z
dlang/dmd pull request #11658 "Fix 20934 - preview=dtorfields segfaults for disabled/extern construc…" was merged into master:
- d856a146c4c7ea67e387928c08589b3be288ef27 by MoonlightSentinel:
Fix 20934 - preview=dtorfields segfaults for disabled/extern constructors
Don't try to insert a destructor body if there's no body because
the following semantic would segfault due to the missing try-block
https://github.com/dlang/dmd/pull/11658