[Issue 3952] pragma(msg,...) has bugs + alternative idea
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Aug 6 09:35:01 PDT 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3952
--- Comment #1 from bearophile_hugs at eml.cc 2010-08-06 09:34:59 PDT ---
In D1 there were no template constraints, so to test the template arguments I
used to add some static asserts inside them. So a wrong template argument shows
a error message written by me that explains why the instantiation has failed
(unfortunately those error messages show the line number inside the template).
When a template constraint is composed of some different parts in &&, it's less
easy to understand what condition has failed, so I miss the error messages
written by me. This is an example (that probably I will simplify), there are
four conditions, and for a person that has not written this code, and is just
using Phobos, it's not immediately obvious what part has failed:
auto opBinary(string op, TOther)(TOther other)
if (op == "~" && is(TOther == struct) &&
(!__traits(compiles, { void isTuple(U...)(Tuple!U){} isTuple(other); })
||
distinctFieldNames!(T, TOther.TypesAndStrings)() )) { ...
There is a simple solution. The simple template constraints often don't need
extra error messages, so they can be left as they are now.
Putting one or more error message inside a template constraints turns them into
messy code, so in such cases it's better to move the tests elsewhere, in an
external template/CTFE:
template IsGoodFoo(T) {
static if (...) {
enum bool IsGoodFoo = true;
} else {
ctputs("this is an error message");
return false;
}
}
void foo(T)(T x) if (IsGoodFoo!T) { ...
So the ctputs() is usable for the template constraints error messages too.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list