<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8">
</head>
<body>
<div style="font-family:sans-serif"><div style="white-space:normal">
<p dir="auto">On 22 Dec 2019, at 3:17, Blaise Tine via cfe-dev wrote:</p>

</div>
<div style="white-space:normal"><blockquote style="border-left:2px solid #777; color:#777; margin:0 0 5px; padding-left:5px"><p dir="auto">Hi all,<br>
I have  C++ DSL that defines its own primitive types and operators and I want to provide some debugging facilities during compilation to display the source location (filename, line number) for uninitialized DSL objects.To capture the source line information for a given DSL object, I'm using __builtin_LINE(x) inside the class constructor, where 'x' is the function nesting depth (see below).</p>
</blockquote></div>
<div style="white-space:normal">

<p dir="auto"><code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">__builtin_LINE()</code> does not take an argument in either Clang or GCC, as far as I can tell, so I’ll assume you’re asking whether that would be a reasonable extension.  And I don’t know why a <em>nesting</em> depth (i.e. the number of functions/structs/whatever  that the current source location is nested within) would affect the result of <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">__builtin_LINE()</code>, so I’ll also assume you actually mean a <em>stack</em> depth (i.e. you would like to return the line number of the caller).  If that’s correct, then the answer is simple: it is not reasonable to implement such a feature in either a plugin or in the normal compiler.  I can see two ways to implement it: (1) emit a specialized version of the function for every caller or (2) dynamically look up line-table information associated with the return address.  Both approaches would be highly complex and have serious drawbacks.</p>

<p dir="auto">Fortunately, you don’t really need any of that, because the whole point of <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">__builtin_LINE()</code> is to be used in a default argument expression, where it will be evaluated in the context of the caller:</p>

<pre style="background-color:#F7F7F7; border-radius:5px 5px 5px 5px; margin-left:15px; margin-right:15px; max-width:90vw; overflow-x:auto; padding:5px" bgcolor="#F7F7F7"><code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0" bgcolor="#F7F7F7">class DSLObject {
public:
  DSLObject(unsigned lineno = __builtin_LINE()) : lineno_(lineno) {}
private:
  int lineno_;
};
</code></pre>

<p dir="auto">John.</p>
</div>
</div>
</body>
</html>