mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00
Fixes the invariant not called on extern(C++) classes issue (#20981)
This commit is contained in:
parent
c5ba78dc34
commit
35f1146a1b
2 changed files with 48 additions and 5 deletions
|
@ -820,15 +820,13 @@ extern (C++) class FuncDeclaration : Declaration
|
||||||
bool addPreInvariant()
|
bool addPreInvariant()
|
||||||
{
|
{
|
||||||
auto ad = isThis();
|
auto ad = isThis();
|
||||||
ClassDeclaration cd = ad ? ad.isClassDeclaration() : null;
|
return (ad && global.params.useInvariants == CHECKENABLE.on && (visibility.kind == Visibility.Kind.protected_ || visibility.kind == Visibility.Kind.public_ || visibility.kind == Visibility.Kind.export_) && !this.isNaked());
|
||||||
return (ad && !(cd && cd.isCPPclass()) && global.params.useInvariants == CHECKENABLE.on && (visibility.kind == Visibility.Kind.protected_ || visibility.kind == Visibility.Kind.public_ || visibility.kind == Visibility.Kind.export_) && !this.isNaked());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool addPostInvariant()
|
bool addPostInvariant()
|
||||||
{
|
{
|
||||||
auto ad = isThis();
|
auto ad = isThis();
|
||||||
ClassDeclaration cd = ad ? ad.isClassDeclaration() : null;
|
return (ad && ad.inv && global.params.useInvariants == CHECKENABLE.on && (visibility.kind == Visibility.Kind.protected_ || visibility.kind == Visibility.Kind.public_ || visibility.kind == Visibility.Kind.export_) && !this.isNaked());
|
||||||
return (ad && !(cd && cd.isCPPclass()) && ad.inv && global.params.useInvariants == CHECKENABLE.on && (visibility.kind == Visibility.Kind.protected_ || visibility.kind == Visibility.Kind.public_ || visibility.kind == Visibility.Kind.export_) && !this.isNaked());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override const(char)* kind() const
|
override const(char)* kind() const
|
||||||
|
|
|
@ -228,8 +228,52 @@ void test16384()
|
||||||
assert(s == "needs to be thrown2");
|
assert(s == "needs to be thrown2");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***************************************************/
|
/***************************************************/
|
||||||
|
// Fix: https://github.com/dlang/dmd/issues/20924 (invariant not called on extern(C++) classes)
|
||||||
|
|
||||||
|
extern(C++) class C
|
||||||
|
{
|
||||||
|
invariant { assert(0); }
|
||||||
|
void f() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern(D) class D
|
||||||
|
{
|
||||||
|
invariant { assert(0); }
|
||||||
|
void f() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test20924()
|
||||||
|
{
|
||||||
|
import core.exception : AssertError;
|
||||||
|
// Test extern(C++) class invariant
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto c = new C();
|
||||||
|
c.f(); // Trigger invariant
|
||||||
|
assert(false, "Failed: invariant in extern(C++) class not checked");
|
||||||
|
}
|
||||||
|
catch (AssertError e)
|
||||||
|
{
|
||||||
|
// Expected behavior - invariant was checked
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
assert(0, "Invariant in extern(C++) class was not checked");
|
||||||
|
|
||||||
|
// Test extern(D) class invariant
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto d = new D();
|
||||||
|
d.f(); // Trigger invariant
|
||||||
|
assert(false, "Failed: invariant in extern(D) class not checked");
|
||||||
|
}
|
||||||
|
catch (AssertError e)
|
||||||
|
{
|
||||||
|
// Expected behavior - invariant was checked
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
assert(0, "Invariant in extern(D) class was not checked");
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
|
@ -238,4 +282,5 @@ void main()
|
||||||
test16384();
|
test16384();
|
||||||
test13113();
|
test13113();
|
||||||
test13147();
|
test13147();
|
||||||
|
test20924();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue