]> granicus.if.org Git - clang/commitdiff
Don't reserve __builtin_types_compatible_p as a C++ keyword
authorAlp Toker <alp@nuanti.com>
Wed, 25 Dec 2013 01:47:02 +0000 (01:47 +0000)
committerAlp Toker <alp@nuanti.com>
Wed, 25 Dec 2013 01:47:02 +0000 (01:47 +0000)
Even g++ considers this a valid C++ identifier and it should only have been
visible in C mode.

Also drop the associated low-value diagnostic.

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

include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Basic/TokenKinds.def
lib/Sema/SemaExprCXX.cpp
test/SemaCXX/types_compatible_p.cpp

index 3a3c93da125352033cc052129c68e2b2232d236e..71d118a2be96d167971276a8ccd157fdc2c2be6c 100644 (file)
@@ -367,8 +367,6 @@ def warn_redecl_library_builtin : Warning<
   "incompatible redeclaration of library function %0">,
   InGroup<DiagGroup<"incompatible-library-redeclaration">>;
 def err_builtin_definition : Error<"definition of builtin function %0">;
-def err_types_compatible_p_in_cplusplus : Error<
-  "__builtin_types_compatible_p is not valid in C++">;
 def warn_builtin_unknown : Warning<"use of unknown builtin %0">,
   InGroup<ImplicitFunctionDeclare>, DefaultError;
 def warn_dyn_class_memaccess : Warning<
index a76d86bb2c1692fe38f160676df02c606b3a393a..54f78536481dd2fbc4e47a9318b3a4026e8a3900 100644 (file)
@@ -348,7 +348,7 @@ KEYWORD(__builtin_choose_expr       , KEYALL)
 KEYWORD(__builtin_offsetof          , KEYALL)
 // __builtin_types_compatible_p is a GNU C extension that we handle like a C++
 // type trait.
-TYPE_TRAIT_2(__builtin_types_compatible_p, TypeCompatible, KEYALL)
+TYPE_TRAIT_2(__builtin_types_compatible_p, TypeCompatible, KEYNOCXX)
 KEYWORD(__builtin_va_arg            , KEYALL)
 KEYWORD(__extension__               , KEYALL)
 KEYWORD(__imag                      , KEYALL)
index a0c123fdaacced06354122b1ac3e448e6902b1c3..2591dbfede61e6e241d65e94edaae201599ef89d 100644 (file)
@@ -3707,16 +3707,7 @@ static bool evaluateTypeTrait(Sema &S, TypeTrait Kind, SourceLocation KWLoc,
 ExprResult Sema::BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc, 
                                 ArrayRef<TypeSourceInfo *> Args, 
                                 SourceLocation RParenLoc) {
-  QualType ResultType = Context.BoolTy;
-  // __builtin_types_compatible_p is a GNU C extension, not a C++ type trait.
-  if (Kind == BTT_TypeCompatible) {
-    ResultType = Context.IntTy;
-    if (getLangOpts().CPlusPlus) {
-      Diag(KWLoc, diag::err_types_compatible_p_in_cplusplus)
-          << SourceRange(KWLoc, RParenLoc);
-      return ExprError();
-    }
-  }
+  QualType ResultType = Context.getLogicalOperationType();
 
   bool Dependent = false;
   for (unsigned I = 0, N = Args.size(); I != N; ++I) {
index 4aa9a1cfa939bb943aa6888611f5a26ad97cc025..ebff53f7c009205e6c4b10cf16aa24f74bc51a9d 100644 (file)
@@ -1,5 +1,8 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify -x c++ %s
+// RUN: %clang_cc1 -fsyntax-only -x c %s
 
-bool f() {
-  return __builtin_types_compatible_p(int, const int); // expected-error{{C++}}
+// Test that GNU C extension __builtin_types_compatible_p() is not available in C++ mode.
+
+int f() {
+  return __builtin_types_compatible_p(int, const int); // expected-error{{}}
 }