]> granicus.if.org Git - clang/commitdiff
Turn off __has_feature(cxx_rtti) when -fno-rtti-data is present
authorReid Kleckner <rnk@google.com>
Thu, 13 Aug 2015 17:56:49 +0000 (17:56 +0000)
committerReid Kleckner <rnk@google.com>
Thu, 13 Aug 2015 17:56:49 +0000 (17:56 +0000)
-fno-rtti-data makes it so that vtables emitted in the current TU lack
RTTI data. This means that dynamic_cast usually fails at runtime. Users
of the existing cxx_rtti feature expect all of RTTI to work, not just
some of it.

Chromium bug for context: http://crbug.com/518191

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@244922 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/PPMacroExpansion.cpp
test/Lexer/has_feature_rtti.cpp

index 42b1d048c40a55b96ca0b3151f7d11b78bb690ce..594365b45e171e0faba239c199fa261c34cbac4a 100644 (file)
@@ -1076,7 +1076,7 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
       .Case("blocks", LangOpts.Blocks)
       .Case("c_thread_safety_attributes", true)
       .Case("cxx_exceptions", LangOpts.CXXExceptions)
-      .Case("cxx_rtti", LangOpts.RTTI)
+      .Case("cxx_rtti", LangOpts.RTTI && LangOpts.RTTIData)
       .Case("enumerator_attributes", true)
       .Case("nullability", true)
       .Case("memory_sanitizer", LangOpts.Sanitize.has(SanitizerKind::Memory))
index 4bfeead329972b0133ca8feea20d1c7e76527417..26eaa2ead6278d3111cd465a269028678533e4f3 100644 (file)
@@ -1,5 +1,6 @@
 // RUN: %clang_cc1 -E %s -o - | FileCheck --check-prefix=CHECK-RTTI %s
 // RUN: %clang_cc1 -E -fno-rtti %s -o - | FileCheck --check-prefix=CHECK-NO-RTTI %s
+// RUN: %clang_cc1 -E -fno-rtti-data %s -o - | FileCheck --check-prefix=CHECK-NO-RTTI %s
 
 #if __has_feature(cxx_rtti)
 int foo();