diff --git a/src/dmd/typesem.d b/src/dmd/typesem.d index 4e636314874c..ffa74d83fe09 100644 --- a/src/dmd/typesem.d +++ b/src/dmd/typesem.d @@ -1156,7 +1156,13 @@ private extern (C++) final class TypeSemanticVisitor : Visitor { if (s) { - s.error(loc, "is used as a type"); + auto td = s.isTemplateDeclaration; + if (td && td.onemember && td.onemember.isAggregateDeclaration) + mtype.error(loc, "template %s `%s` is used as a type without instantiation" + ~ "; to instantiate it use `%s!(arguments)`", + s.kind, s.toPrettyChars, s.ident.toChars); + else + mtype.error(loc, "%s `%s` is used as a type", s.kind, s.toPrettyChars); //assert(0); } else diff --git a/test/fail_compilation/diag6539.d b/test/fail_compilation/diag6539.d index eddb5d2ef838..c202548aac53 100644 --- a/test/fail_compilation/diag6539.d +++ b/test/fail_compilation/diag6539.d @@ -1,7 +1,7 @@ /* TEST_OUTPUT: --- -fail_compilation/diag6539.d(21): Error: overloadset diag6539.Rectangle is used as a type +fail_compilation/diag6539.d(21): Error: overloadset `diag6539.Rectangle` is used as a type --- */ diff --git a/test/fail_compilation/notype.d b/test/fail_compilation/notype.d new file mode 100644 index 000000000000..1825968517ed --- /dev/null +++ b/test/fail_compilation/notype.d @@ -0,0 +1,31 @@ +struct S(int var = 3) { + int a; +} +S s; + +alias A() = int; +A a; + +enum e() = 5; +e val; + +interface I() +{ +} +I i; + +template t() +{ +} +t tv; + +/* +TEST_OUTPUT: +--- +fail_compilation/notype.d(4): Error: template struct `notype.S(int var = 3)` is used as a type without instantiation; to instantiate it use `S!(arguments)` +fail_compilation/notype.d(7): Error: template `notype.A()` is used as a type +fail_compilation/notype.d(10): Error: template `notype.e()` is used as a type +fail_compilation/notype.d(15): Error: template interface `notype.I()` is used as a type without instantiation; to instantiate it use `I!(arguments)` +fail_compilation/notype.d(20): Error: template `notype.t()` is used as a type +--- +*/