Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/include/dmd/aggregate.h
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ class ClassDeclaration : public AggregateDeclaration
ObjcClassDeclaration objc; // Data for a class declaration that is needed for the Objective-C integration

static ClassDeclaration *create(Loc loc, Identifier *id, BaseClasses *baseclasses, Dsymbols *members, bool inObject);
const char *toPrettyChars(bool QualifyTypes = false) override;
const char *toPrettyChars(bool QualifyTypes = false, bool keepOneMember = false) override;
ClassDeclaration *syntaxCopy(Dsymbol *s) override;

#define OFFSET_RUNTIME 0x76543210
Expand Down
2 changes: 1 addition & 1 deletion compiler/include/dmd/attrib.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class VisibilityDeclaration final : public AttribDeclaration

VisibilityDeclaration *syntaxCopy(Dsymbol *s) override;
const char *kind() const override;
const char *toPrettyChars(bool unused) override;
const char *toPrettyChars(bool unused, bool unused2 = false) override;
void accept(Visitor *v) override { v->visit(this); }
};

Expand Down
4 changes: 2 additions & 2 deletions compiler/include/dmd/declaration.h
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ class FuncDeclaration : public Declaration

bool inUnittest();
LabelDsymbol *searchLabel(Identifier *ident, Loc loc);
const char *toPrettyChars(bool QualifyTypes = false) override;
const char *toPrettyChars(bool QualifyTypes = false, bool keepOneMember = false) override;
const char *toFullSignature(); // for diagnostics, e.g. 'int foo(int x, int y) pure'
bool isMain() const;
bool isCMain() const;
Expand Down Expand Up @@ -753,7 +753,7 @@ class FuncLiteralDeclaration final : public FuncDeclaration
AggregateDeclaration *isThis() override;

const char *kind() const override;
const char *toPrettyChars(bool QualifyTypes = false) override;
const char *toPrettyChars(bool QualifyTypes = false, bool keepOneMember = false) override;
void accept(Visitor *v) override { v->visit(this); }
};

Expand Down
2 changes: 1 addition & 1 deletion compiler/include/dmd/dsymbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ class Dsymbol : public ASTNode
DYNCAST dyncast() const override final { return DYNCAST_DSYMBOL; }

virtual Identifier *getIdent();
virtual const char *toPrettyChars(bool QualifyTypes = false);
virtual const char *toPrettyChars(bool QualifyTypes = false, bool keepOneMember = false);
virtual const char *kind() const;
virtual bool isforwardRef();
virtual AggregateDeclaration *isThis(); // is a 'this' required to access the member
Expand Down
2 changes: 1 addition & 1 deletion compiler/src/dmd/attrib.d
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ extern (C++) final class VisibilityDeclaration : AttribDeclaration
return "visibility attribute";
}

override const(char)* toPrettyChars(bool)
override const(char)* toPrettyChars(bool, bool keepOneMember = false)
{
assert(visibility.kind > Visibility.Kind.undefined);
OutBuffer buf;
Expand Down
4 changes: 2 additions & 2 deletions compiler/src/dmd/dclass.d
Original file line number Diff line number Diff line change
Expand Up @@ -230,12 +230,12 @@ extern (C++) class ClassDeclaration : AggregateDeclaration
return new ClassDeclaration(loc, id, baseclasses, members, inObject);
}

override const(char)* toPrettyChars(bool qualifyTypes = false)
override const(char)* toPrettyChars(bool qualifyTypes = false, bool keepOneMember = false)
{
if (objc.isMeta)
return .objc.toPrettyChars(this, qualifyTypes);

return super.toPrettyChars(qualifyTypes);
return super.toPrettyChars(qualifyTypes, keepOneMember);
}

override ClassDeclaration syntaxCopy(Dsymbol s)
Expand Down
20 changes: 19 additions & 1 deletion compiler/src/dmd/dsymbol.d
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,7 @@ extern (C++) class Dsymbol : ASTNode
return ident;
}

const(char)* toPrettyChars(bool QualifyTypes = false)
const(char)* toPrettyChars(bool QualifyTypes = false, bool keepOneMember = false)
{
//printf("Dsymbol::toPrettyChars() '%s'\n", toChars());
if (!parent)
Expand All @@ -695,6 +695,24 @@ extern (C++) class Dsymbol : ASTNode
if (p.parent)
{
addQualifiers(p.parent);

bool isOneMember(T)(T t)
{
import dmd.dsymbolsem;
Dsymbol sym;
if (auto ti = p.parent.isTemplateInstance())
if (auto ident = p.getIdent())
if (ident is ti.name)
if (oneMembers(ti.members, sym, ident) && sym is p)
return true;
return false;
}

if (!keepOneMember)
if (isOneMember(p.parent.isTemplateInstance()) ||
isOneMember(p.parent.isTemplateDeclaration()))
return;

buf.writeByte('.');
}
const s = QualifyTypes ? p.toPrettyCharsHelper() : p.toChars();
Expand Down
10 changes: 5 additions & 5 deletions compiler/src/dmd/func.d
Original file line number Diff line number Diff line change
Expand Up @@ -452,11 +452,11 @@ extern (C++) class FuncDeclaration : Declaration
return cast(LabelDsymbol)s;
}

override const(char)* toPrettyChars(bool QualifyTypes = false)
override const(char)* toPrettyChars(bool QualifyTypes = false, bool keepOneMember = false)
{
if (isMain())
return "D main";
return Dsymbol.toPrettyChars(QualifyTypes);
return Dsymbol.toPrettyChars(QualifyTypes, keepOneMember);
}

/** for diagnostics, e.g. 'int foo(int x, int y) pure' */
Expand Down Expand Up @@ -860,14 +860,14 @@ extern (C++) final class FuncLiteralDeclaration : FuncDeclaration
return (tok != TOK.function_) ? "delegate" : "function";
}

override const(char)* toPrettyChars(bool QualifyTypes = false)
override const(char)* toPrettyChars(bool QualifyTypes = false, bool keepOneMember = false)
{
if (parent)
{
if (TemplateInstance ti = parent.isTemplateInstance())
return ti.tempdecl.toPrettyChars(QualifyTypes);
return ti.tempdecl.toPrettyChars(QualifyTypes, keepOneMember);
}
return Dsymbol.toPrettyChars(QualifyTypes);
return Dsymbol.toPrettyChars(QualifyTypes, keepOneMember);
}

override void accept(Visitor v)
Expand Down
2 changes: 1 addition & 1 deletion compiler/src/dmd/glue/todt.d
Original file line number Diff line number Diff line change
Expand Up @@ -1323,7 +1323,7 @@ private extern (C++) class TypeInfoDtVisitor : Visitor
dtb.size(0);

// string name;
const(char)* name = sd.toPrettyChars();
const(char)* name = sd.toPrettyChars(false, true);
size_t namelen = strlen(name);
dtb.size(namelen);
dtb.xoff(cast(Symbol*)d.csym, Type.typeinfoenum.structsize);
Expand Down
4 changes: 2 additions & 2 deletions compiler/src/dmd/glue/toobj.d
Original file line number Diff line number Diff line change
Expand Up @@ -1286,7 +1286,7 @@ private void ClassInfoToDt(ref DtBuilder dtb, ClassDeclaration cd, Symbol* sinit
size_t namelen = strlen(name);
if (!(namelen > 9 && memcmp(name, "TypeInfo_".ptr, 9) == 0))
{
name = cd.toPrettyChars(/*QualifyTypes=*/ true);
name = cd.toPrettyChars(/*QualifyTypes=*/ true, true);
namelen = strlen(name);
}
dtb.size(namelen);
Expand Down Expand Up @@ -1535,7 +1535,7 @@ private void InterfaceInfoToDt(ref DtBuilder dtb, InterfaceDeclaration id)
dtb.size(0); // initializer

// name[]
const(char) *name = id.toPrettyChars(/*QualifyTypes=*/ true);
const(char) *name = id.toPrettyChars(/*QualifyTypes=*/ true, /*keepOneMember=*/ true);
size_t namelen = strlen(name);
dtb.size(namelen);
auto csym = cast(Symbol*)id.csym;
Expand Down
6 changes: 3 additions & 3 deletions compiler/src/dmd/json.d
Original file line number Diff line number Diff line change
Expand Up @@ -586,15 +586,15 @@ public:
{
if (cd.baseClass && cd.baseClass.ident != Id.Object)
{
property("base", cd.baseClass.toPrettyChars(true).toDString);
property("base", cd.baseClass.toPrettyChars(true, true).toDString);
}
if (cd.interfaces.length)
{
propertyStart("interfaces");
arrayStart();
foreach (b; cd.interfaces)
{
item(b.sym.toPrettyChars(true).toDString);
item(b.sym.toPrettyChars(true, true).toDString);
}
arrayEnd();
}
Expand Down Expand Up @@ -628,7 +628,7 @@ public:
for (size_t i = 0; i < d.foverrides.length; i++)
{
FuncDeclaration fd = d.foverrides[i];
item(fd.toPrettyChars().toDString);
item(fd.toPrettyChars(true, true).toDString);
}
arrayEnd();
}
Expand Down
10 changes: 5 additions & 5 deletions compiler/test/compilable/ftimetrace.d
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,22 @@ TEST_OUTPUT:
Code generation,
Codegen: function add, object.add
Codegen: function fun, object.fun
Codegen: function id, object.id!int.id
Codegen: function id, object.id!int
Codegen: function uses, object.uses
Codegen: module object, object
Ctfe: add(4, 8), add(4, 8)
Ctfe: call add, object.add(4, 8)
DFA: add, object.add
DFA: fun, object.fun
DFA: id, object.id!int.id
DFA: id, object.id!int
DFA: uses, object.uses
Import object.object, object.object
Inlining,
Parse: Module object, object
Parsing,
Sema1: Function add, object.add
Sema1: Function fun, object.fun
Sema1: Function id, object.id!int.id
Sema1: Function id, object.id!int
Sema1: Function uses, object.uses
Sema1: Module object, object
Sema1: Overload Resolution: id!int, id!int
Expand All @@ -32,12 +32,12 @@ Sema1: Template Members: id!int, object.id!int
Sema2: Template Instance: id!int, object.id!int
Sema2: add, object.add
Sema2: fun, object.fun
Sema2: id, object.id!int.id
Sema2: id, object.id!int
Sema2: uses, object.uses
Sema3: Template Instance: id!int, object.id!int
Sema3: add, object.add
Sema3: fun, object.fun
Sema3: id, object.id!int.id
Sema3: id, object.id!int
Sema3: uses, object.uses
Semantic analysis,
---
Expand Down
4 changes: 2 additions & 2 deletions compiler/test/compilable/sw_transition_field.d
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ TEST_OUTPUT:
---
compilable/sw_transition_field.d(15): `sw_transition_field.S1.ix` is `immutable` field
compilable/sw_transition_field.d(16): `sw_transition_field.S1.cx` is `const` field
compilable/sw_transition_field.d(21): `sw_transition_field.S2!(immutable(int)).S2.f` is `immutable` field
compilable/sw_transition_field.d(21): `sw_transition_field.S2!(const(int)).S2.f` is `const` field
compilable/sw_transition_field.d(21): `sw_transition_field.S2!(immutable(int)).f` is `immutable` field
compilable/sw_transition_field.d(21): `sw_transition_field.S2!(const(int)).f` is `const` field
---
*/

Expand Down
8 changes: 4 additions & 4 deletions compiler/test/compilable/test16495.d
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,13 @@ void symbols()
static assert(__traits(fullyQualifiedName, qnTests.Inner) == prefix ~ "Inner");
static assert(__traits(fullyQualifiedName, qnTests.func) == prefix ~ "func");

static assert(__traits(fullyQualifiedName, qnTests.Data!int) == prefix ~ "Data!int.Data");
static assert(__traits(fullyQualifiedName, qnTests.Data!int.x) == prefix ~ "Data!int.Data.x");
static assert(__traits(fullyQualifiedName, qnTests.tfunc!(int[])) == prefix ~ "tfunc!(int[]).tfunc");
static assert(__traits(fullyQualifiedName, qnTests.Data!int) == prefix ~ "Data!int");
static assert(__traits(fullyQualifiedName, qnTests.Data!int.x) == prefix ~ "Data!int.x");
static assert(__traits(fullyQualifiedName, qnTests.tfunc!(int[])) == prefix ~ "tfunc!(int[])");
static assert(__traits(fullyQualifiedName, qnTests.Inst!(Object)) == prefix ~ "Inst!(Object)");
static assert(__traits(fullyQualifiedName, qnTests.Inst!(Object).x) == prefix ~ "Inst!(Object).x");
static assert(__traits(fullyQualifiedName, qnTests.Test12309!(int, 10, "str"))
== prefix ~ "Test12309!(int, 10, \"str\").Test12309");
== prefix ~ "Test12309!(int, 10, \"str\")");
}

void names()
Expand Down
2 changes: 1 addition & 1 deletion compiler/test/compilable/test20063.d
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// REQUIRED_ARGS: -verrors=simple
/* TEST_OUTPUT:
---
compilable/test20063.d(11): Deprecation: function `test20063.main.f!(delegate () pure nothrow @safe => new C).f` function requires a dual-context, which is deprecated
compilable/test20063.d(11): Deprecation: function `test20063.main.f!(delegate () pure nothrow @safe => new C)` function requires a dual-context, which is deprecated
compilable/test20063.d(20): instantiated from here: `f!(delegate () pure nothrow @safe => new C)`
---
*/
Expand Down
2 changes: 1 addition & 1 deletion compiler/test/compilable/test324.d
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ compilable/test324.d(18): Deprecation: function `test324.main.doStuff!((i)
{
return i;
}
).doStuff` function requires a dual-context, which is deprecated
)` function requires a dual-context, which is deprecated
compilable/test324.d(24): instantiated from here: `doStuff!((i)
{
return i;
Expand Down
2 changes: 1 addition & 1 deletion compiler/test/fail_compilation/bug8150b.d
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
TEST_OUTPUT:
---
fail_compilation/bug8150b.d(15): Error: `object.Exception` is thrown but not caught
fail_compilation/bug8150b.d(13): Error: constructor `bug8150b.Foo.this!().this` may throw but is marked as `nothrow`
fail_compilation/bug8150b.d(13): Error: constructor `bug8150b.Foo.this!()` may throw but is marked as `nothrow`
fail_compilation/bug8150b.d(20): Error: template instance `bug8150b.Foo.this!()` error instantiating
---
*/
Expand Down
2 changes: 1 addition & 1 deletion compiler/test/fail_compilation/bug9631.d
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ TEST_OUTPUT:
---
fail_compilation/bug9631.d(108): Error: function `ft` is not callable using argument types `(S)`
fail_compilation/bug9631.d(108): cannot pass argument `x` of type `bug9631.S` to parameter `bug9631.tem!().S __param_0`
fail_compilation/bug9631.d(107): `bug9631.targ.ft!().ft(S __param_0)` declared here
fail_compilation/bug9631.d(107): `bug9631.targ.ft!()(S __param_0)` declared here
fail_compilation/bug9631.d(109): Error: template `ft` is not callable using argument types `!()(S)`
fail_compilation/bug9631.d(107): Candidate is: `ft()(tem!().S)`
fail_compilation/bug9631.d(111): Error: template `ft2` is not callable using argument types `!()(S, int)`
Expand Down
8 changes: 4 additions & 4 deletions compiler/test/fail_compilation/diag10319.d
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ TEST_OUTPUT:
fail_compilation/diag10319.d(30): Error: `pure` function `D main` cannot call impure function `diag10319.foo`
fail_compilation/diag10319.d(30): Error: `@safe` function `D main` cannot call `@system` function `diag10319.foo`
fail_compilation/diag10319.d(19): `diag10319.foo` is declared here
fail_compilation/diag10319.d(31): Error: `pure` function `D main` cannot call impure function `diag10319.bar!int.bar`
fail_compilation/diag10319.d(31): Error: `pure` function `D main` cannot call impure function `diag10319.bar!int`
fail_compilation/diag10319.d(23): and accessing mutable static data `g` makes it fail to infer `pure`
fail_compilation/diag10319.d(31): Error: `@safe` function `D main` cannot call `@system` function `diag10319.bar!int.bar`
fail_compilation/diag10319.d(31): Error: `@safe` function `D main` cannot call `@system` function `diag10319.bar!int`
fail_compilation/diag10319.d(24): and taking the address of stack-allocated local variable `x` makes it fail to infer `@safe`
fail_compilation/diag10319.d(21): `diag10319.bar!int.bar` is declared here
fail_compilation/diag10319.d(21): `diag10319.bar!int` is declared here
fail_compilation/diag10319.d(30): Error: function `diag10319.foo` is not `nothrow`
fail_compilation/diag10319.d(31): Error: function `diag10319.bar!int.bar` is not `nothrow`
fail_compilation/diag10319.d(31): Error: function `diag10319.bar!int` is not `nothrow`
fail_compilation/diag10319.d(25): and `object.Exception` being thrown but not caught makes it fail to infer `nothrow`
fail_compilation/diag10319.d(28): Error: function `D main` may throw but is marked as `nothrow`
---
Expand Down
2 changes: 1 addition & 1 deletion compiler/test/fail_compilation/diag14145.d
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ TEST_OUTPUT:
---
fail_compilation/diag14145.d(14): Error: no property `i` for `_` of type `diag14145.main.Capture!(i)`
fail_compilation/diag14145.d(33): Error: expression `*this.ptr` of type `shared(int)` is not implicitly convertible to return type `ref int`
fail_compilation/diag14145.d(14): Error: template instance `diag14145.main.Capture!(i).Capture.opDispatch!"i"` error instantiating
fail_compilation/diag14145.d(14): Error: template instance `diag14145.main.Capture!(i).opDispatch!"i"` error instantiating
---
*/

Expand Down
2 changes: 1 addition & 1 deletion compiler/test/fail_compilation/diag9620.d
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
TEST_OUTPUT:
---
fail_compilation/diag9620.d(19): Error: `pure` function `diag9620.main.bar` cannot call impure function `diag9620.foo1`
fail_compilation/diag9620.d(20): Error: `pure` function `diag9620.main.bar` cannot call impure function `diag9620.foo2!().foo2`
fail_compilation/diag9620.d(20): Error: `pure` function `diag9620.main.bar` cannot call impure function `diag9620.foo2!()`
fail_compilation/diag9620.d(13): and accessing mutable static data `x` makes it fail to infer `pure`
---
*/
Expand Down
12 changes: 6 additions & 6 deletions compiler/test/fail_compilation/disable.d
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ TEST_OUTPUT:
fail_compilation/disable.d(56): Error: function `disable.DisabledOpAssign.opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(59): Error: function `disable.DisabledPostblit.opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(62): Error: function `disable.HasDtor.opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(66): Error: generated function `disable.Nested!(DisabledOpAssign).Nested.opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(69): Error: generated function `disable.Nested!(DisabledPostblit).Nested.opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(72): Error: generated function `disable.Nested!(HasDtor).Nested.opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(76): Error: generated function `disable.NestedDtor!(DisabledOpAssign).NestedDtor.opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(79): Error: generated function `disable.NestedDtor!(DisabledPostblit).NestedDtor.opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(82): Error: generated function `disable.NestedDtor!(HasDtor).NestedDtor.opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(66): Error: generated function `disable.Nested!(DisabledOpAssign).opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(69): Error: generated function `disable.Nested!(DisabledPostblit).opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(72): Error: generated function `disable.Nested!(HasDtor).opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(76): Error: generated function `disable.NestedDtor!(DisabledOpAssign).opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(79): Error: generated function `disable.NestedDtor!(DisabledPostblit).opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(82): Error: generated function `disable.NestedDtor!(HasDtor).opAssign` cannot be used because it is annotated with `@disable`
fail_compilation/disable.d(84): Error: enum member `disable.Enum1.value` cannot be used because it is annotated with `@disable`
---
*/
Expand Down
2 changes: 1 addition & 1 deletion compiler/test/fail_compilation/fail104.d
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
TEST_OUTPUT:
---
fail_compilation/fail104.d(26): Error: template instance `P!()` `P` is not a template declaration, it is a alias
fail_compilation/fail104.d(26): Error: mixin `fail104.C!(S).C.T!()` is not defined
fail_compilation/fail104.d(26): Error: mixin `fail104.C!(S).T!()` is not defined
fail_compilation/fail104.d(31): Error: template instance `fail104.C!(S)` error instantiating
---
*/
Expand Down
2 changes: 1 addition & 1 deletion compiler/test/fail_compilation/fail11375.d
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail11375.d(18): Error: constructor `fail11375.D!().D.this` is not `nothrow`
fail_compilation/fail11375.d(18): Error: constructor `fail11375.D!().this` is not `nothrow`
which calls `this`
fail_compilation/fail11375.d(16): Error: function `D main` may throw but is marked as `nothrow`
---
Expand Down
8 changes: 4 additions & 4 deletions compiler/test/fail_compilation/fail13120.d
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ void g1(char[] s) pure @nogc
/*
TEST_OUTPUT:
---
fail_compilation/fail13120.d(35): Error: `pure` function `fail13120.h2` cannot call impure function `fail13120.g2!().g2`
fail_compilation/fail13120.d(35): Error: `pure` function `fail13120.h2` cannot call impure function `fail13120.g2!()`
fail_compilation/fail13120.d(30): which calls `f2`
fail_compilation/fail13120.d(35): Error: `@safe` function `fail13120.h2` cannot call `@system` function `fail13120.g2!().g2`
fail_compilation/fail13120.d(27): `fail13120.g2!().g2` is declared here
fail_compilation/fail13120.d(35): Error: `@nogc` function `fail13120.h2` cannot call non-@nogc function `fail13120.g2!().g2`
fail_compilation/fail13120.d(35): Error: `@safe` function `fail13120.h2` cannot call `@system` function `fail13120.g2!()`
fail_compilation/fail13120.d(27): `fail13120.g2!()` is declared here
fail_compilation/fail13120.d(35): Error: `@nogc` function `fail13120.h2` cannot call non-@nogc function `fail13120.g2!()`
---
*/
void f2() {}
Expand Down
Loading
Loading