zero9178 created this revision. zero9178 added reviewers: rnk, thakis, hans. zero9178 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
When using the -fno-rtti option of the GCC style clang++, using typeid results in an error. The MSVC STL however kindly provides a define flag called _HAS_STATIC_RTTI, which either enables or disables uses of typeid throughout the STL. By default, if undefined, it is set to 1, enabling the use of typeid. With this patch, _HAS_STATIC_RTTI is set to 0 when -fno-rtti is specified. This way various headers of the MSVC STL like functional can be consumed without compilation failures. ---- Some context: I was first made aware of this define in this bug report regarding twoPhase lookup: https://bugs.chromium.org/p/chromium/issues/detail?id=996675 Back then however there was still a usage of typeid left unguarded, which has since been fixed in this commit https://github.com/microsoft/STL/issues/340. Since that is November 2019, so a rather recent version of MSVC, this will not work in versions prior to this fix. For compat one could maybe allow `typeid(void)`, but that is beyond the scope of this patch either way I think. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D103771 Files: clang/lib/Driver/ToolChains/MSVC.cpp clang/lib/Driver/ToolChains/MSVC.h clang/test/Driver/msvc-static-rtti.cpp Index: clang/test/Driver/msvc-static-rtti.cpp =================================================================== --- /dev/null +++ clang/test/Driver/msvc-static-rtti.cpp @@ -0,0 +1,5 @@ +// RUN: %clang -target x86_64-pc-windows-msvc -fno-rtti -### %s 2>&1 | FileCheck %s -check-prefix STATIC-RTTI-DEF +// RUN: %clang -target x86_64-pc-windows-msvc -frtti -### %s 2>&1 | FileCheck %s -check-prefix STATIC-RTTI-DEF-NOT + +// STATIC-RTTI-DEF: -D_HAS_STATIC_RTTI=0 +// STATIC-RTTI-DEF-NOT: -D_HAS_STATIC_RTTI=0 Index: clang/lib/Driver/ToolChains/MSVC.h =================================================================== --- clang/lib/Driver/ToolChains/MSVC.h +++ clang/lib/Driver/ToolChains/MSVC.h @@ -122,6 +122,11 @@ bool FoundMSVCInstall() const { return !VCToolChainPath.empty(); } + void + addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args, + Action::OffloadKind DeviceOffloadKind) const override; + protected: void AddSystemIncludeWithSubfolder(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Index: clang/lib/Driver/ToolChains/MSVC.cpp =================================================================== --- clang/lib/Driver/ToolChains/MSVC.cpp +++ clang/lib/Driver/ToolChains/MSVC.cpp @@ -1555,3 +1555,11 @@ return DAL; } + +void MSVCToolChain::addClangTargetOptions( + const ArgList &DriverArgs, ArgStringList &CC1Args, + Action::OffloadKind DeviceOffloadKind) const { + if (DriverArgs.hasArg(options::OPT_fno_rtti, options::OPT_frtti, + /*Default=*/false)) + CC1Args.push_back("-D_HAS_STATIC_RTTI=0"); +}
Index: clang/test/Driver/msvc-static-rtti.cpp =================================================================== --- /dev/null +++ clang/test/Driver/msvc-static-rtti.cpp @@ -0,0 +1,5 @@ +// RUN: %clang -target x86_64-pc-windows-msvc -fno-rtti -### %s 2>&1 | FileCheck %s -check-prefix STATIC-RTTI-DEF +// RUN: %clang -target x86_64-pc-windows-msvc -frtti -### %s 2>&1 | FileCheck %s -check-prefix STATIC-RTTI-DEF-NOT + +// STATIC-RTTI-DEF: -D_HAS_STATIC_RTTI=0 +// STATIC-RTTI-DEF-NOT: -D_HAS_STATIC_RTTI=0 Index: clang/lib/Driver/ToolChains/MSVC.h =================================================================== --- clang/lib/Driver/ToolChains/MSVC.h +++ clang/lib/Driver/ToolChains/MSVC.h @@ -122,6 +122,11 @@ bool FoundMSVCInstall() const { return !VCToolChainPath.empty(); } + void + addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args, + Action::OffloadKind DeviceOffloadKind) const override; + protected: void AddSystemIncludeWithSubfolder(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Index: clang/lib/Driver/ToolChains/MSVC.cpp =================================================================== --- clang/lib/Driver/ToolChains/MSVC.cpp +++ clang/lib/Driver/ToolChains/MSVC.cpp @@ -1555,3 +1555,11 @@ return DAL; } + +void MSVCToolChain::addClangTargetOptions( + const ArgList &DriverArgs, ArgStringList &CC1Args, + Action::OffloadKind DeviceOffloadKind) const { + if (DriverArgs.hasArg(options::OPT_fno_rtti, options::OPT_frtti, + /*Default=*/false)) + CC1Args.push_back("-D_HAS_STATIC_RTTI=0"); +}
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits