Re: Compiling C++ Templates as opposed to Preprocessing them.
CornedBee wrote:
On Aug 1, 10:51 pm, Walter Bright <newshou...@digitalmars.com> wrote:
CornedBee wrote:
I am pretty sure, from observing its behaviour, that MSVC caches the
token stream instead of building an AST, but that's not a good
approach: there are various bugs that can be traced to this
implementation choice.
Please give an example.
Here's an interesting bug, though. It demonstrates that VC++ most
likely uses token-caching, and also some other details about how it
works. I'm recreating it from memory here, so I can't guarantee this
really demonstrates the bug I encountered.
#include <iostream>
namespace detail {
struct S {};
}
namespace foo {
template <typename X>
void f(X, detail::S *) {
std::cerr << "Template\n";
}
void f(int, bool) {
std::cerr << "Plain\n";
}
namespace detail {
}
}
int main() {
detail::S s;
foo::f(1, &s);
}
A conforming compiler will compile this program to print "Template". VC
++ compiled it to print "Plain".
Digital Mars C++ compiles it and prints "Template", yet uses token caching.
This is what surprises me about your statement that token-caching is
easier than tree substitution. I would have thought that really
getting name lookup (in particular two-phase name lookup) right for
token caching is devilishly hard.
No, it's straightforward, though it took me a while to figure it out.
You either have to attach the lookup
result to the cached identifier tokens (but you can't do that, because
you need a proper parse to determine if you're even supposed to look
up a name), or you need to be able to recreate the exact lookup
context at the template definition point. I don't know about DMC++,
but in Clang that would be a major challenge.
If you have a better idea, I'd be interested in hearing about it.
Just keep track of the source locations of each definition in the symbol table.
You probably do that already for the symbolic debug info.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]