[cfe-dev] MS/Borland portability and 2-phase lookup

Francois Pichet pichet2000 at gmail.com
Fri Mar 4 23:47:54 PST 2011


On Fri, Mar 4, 2011 at 3:08 AM, Eric Niebler <eric at boostpro.com> wrote:
> We have a portability problem compiling old code for MS/Borland with
> clang: 2-phase lookup. Those compilers don't do it, so they accept code
> that clang rejects. For example:
>
> template<class X>
> struct S {
>  int i;
> };
>
> template<class Y>
> struct T {
>  T() {
>    i = 0; // ERROR, should be T::i or this->i
>  }
> };
>
> Clang correctly diagnoses this problem, which presents a problem for old
> broken code that compiles OK with MS and Borland. This problem appears
> to be quite widespread.
>
> Would there be any interest in a patch that turns off 2-phase lookup
> when in MS/Borland compatibility mode
> (-fms-extensions/-fborland-extensions)? If so, I can see about providing
> one.
>

Hi, I am very close to submit a patch that will dramatically improve
clang -fms-extensions mode handling of microsoft template.

What the patch does (suggested by Doug Gregor on the IRC channel) is
to simply skip parsing of template function code, lex and save the
tokens and then at the end of the translation unit do the actual
parsing with all the information of the translation unit available
(similar to the way inline functions parsing is postponed to the end
of the class definition)

This solves the vast majority of errors when parsing the Microsoft
template headers with clang.
Actually this evening, I was even able to self-host clang (on darwin)
with this mechanism.




More information about the cfe-dev mailing list