[Issue 3952] New: pragma(msg,...) has bugs + alternative idea

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Mar 13 05:11:29 PST 2010


http://d.puremagic.com/issues/show_bug.cgi?id=3952

           Summary: pragma(msg,...) has bugs + alternative idea
           Product: D
           Version: 2.041
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: bearophile_hugs at eml.cc


--- Comment #0 from bearophile_hugs at eml.cc 2010-03-13 05:11:28 PST ---
The D2 docs state about pragma(msg, ...):
Prints a message while compiling, the AssignExpressions must be string
literals:
pragma(msg, "compiling...");

I think that means it must accept string literals only, and produce a syntax
error in all the other cases. In practice if you look at the following program
the pragma(msg, foo0()); prints the "this is a test" string. This is useful,
but in many other cases this doesn't work or works in strange ways:


string foo0() {
    return "this is a test";
}
string foo1() {
    return "";
}
string foo2() {
    string result;
    return result;
}
string foo3() {
    return [];
}
pragma(msg, foo0());
pragma(msg, foo1());
pragma(msg, foo2());
pragma(msg, foo3());
string hello = "red";
pragma(msg, hello);
pragma(msg, 12);
void main() {}



The compile-timeoutput of that program is:
this is a test

null
[]
hello
12


So I think pragma(msg,...) needs some debugging.

-------------

This program doesn't compile:


enum int x = 10;
static if (x)
    pragma(msg, "true");
else
    pragma(msg, "false");
void main() {}



It prints the error:
test.d(4): Declaration expected, not 'else'

I can understand the cause of that error, but to improve the usefulness of the
pragma and avoid errors like that one I think the compiler can rewrite the
pragma(msg, ...) as:

{pragma(msg, ...);}

-------------

To increase the usefulness of the pragma(msg, ...) I suggest to not let it
print a newline after the string.

-------------

D2 programs have a better and better CTFE, so the need for good enough printing
is growing.

So I suggest to add a simple printing function that works in the same way both
at compile-time in CTFE and at runtime. To keep things simple it can just print
a string (literal or inside a variable) and it does NOT print a newline.

It can be used in a loop too, in CTFE too, to print many things (so it's
different from a pragma(msg,...):

string foo(int i) {
    foreach (i, 0 .. 10)
        ctputs(ToString!(i));
}

Note that it's a true function, so there is no need for {}.

"ctputs" is just one of the possible names of this function.

Once such function is present, the pragma(msg,...) can probably be removed from
the language.

-- 
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