[cfe-commits] [patch] Let clang parse typeid() on windows if _HAS_EXCEPTIONS is defined to 0
Nico Weber
thakis at chromium.org
Tue Jun 19 17:00:09 PDT 2012
On Thu, Apr 26, 2012 at 9:18 AM, John McCall <rjmccall at apple.com> wrote:
> On Apr 24, 2012, at 7:38 PM, Nico Weber wrote:
>> if _HAS_EXCEPTIONS is set to 0, typeid() can't be used in clang on
>> windows. One use case where this happens is ICU in chromium:
>> http://git.chromium.org/gitweb/?p=chromium/deps/icu46.git;a=commitdiff_plain;h=8ad988882c0a6bb2ac66eecab662141110840e66
>>
>> This is a reduced reproduction that builds fine with MSVC:
>>
>> #define _HAS_EXCEPTIONS 0
>> #include <exception>
>> #include <typeinfo> // for typeid to work.
>>
>> void f() {
>> (void)typeid(int); // just typeid
>> }
>>
>> clang on the other hand complains about typeid requiring an include
>> for <typeinfo>. That's because clang tries to look up std::type_info,
>> and the MS typeinfo header apparently doesn't define type_info in the
>> std namespace, but only if _HAS_EXCEPTIONS is defined to 0. The
>> attached patch lets clang look up type_info in the global namespace in
>> ms compat mode if the lookup for std::type-info fails.
>
> That's a pretty awesome header bug. Have you verified that MSVC
> actually produces a value of type 'const ::type_info &', rather than (say)
> implicitly forward-declaring std::type_info?
Yes, this program builds fine:
#define _HAS_EXCEPTIONS 0
#include <exception>
#include <typeinfo>
#include <stdio.h>
int main() {
const ::type_info& i = typeid(int);
printf("%s\n", i.name());
}
>
> Also, please add a comment describing this problem in the code,
> and make the testcase something like
> MicrosoftCompatibilityNoExceptions.cpp so that we can reasonably
> put other things in there.
Both done. Landed in r158768, thanks!
Nico
More information about the cfe-commits
mailing list