mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 03:56:16 +08:00
Ban the use of __builtin_types_compatible_p in C++; g++ doesn't support it,
and it isn't clear exactly what it's supposed to mean. Thanks Eli! llvm-svn: 72142
This commit is contained in:
@@ -110,6 +110,8 @@ def err_implicit_decl_requires_stdio : Error<
|
||||
def warn_redecl_library_builtin : Warning<
|
||||
"incompatible redeclaration of library function %0">;
|
||||
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++">;
|
||||
|
||||
/// parser diagnostics
|
||||
def ext_typedef_without_a_name : ExtWarn<"typedef requires a name">;
|
||||
|
||||
@@ -5022,6 +5022,12 @@ Sema::OwningExprResult Sema::ActOnTypesCompatibleExpr(SourceLocation BuiltinLoc,
|
||||
|
||||
assert((!argT1.isNull() && !argT2.isNull()) && "Missing type argument(s)");
|
||||
|
||||
if (getLangOptions().CPlusPlus) {
|
||||
Diag(BuiltinLoc, diag::err_types_compatible_p_in_cplusplus)
|
||||
<< SourceRange(BuiltinLoc, RPLoc);
|
||||
return ExprError();
|
||||
}
|
||||
|
||||
return Owned(new (Context) TypesCompatibleExpr(Context.IntTy, BuiltinLoc,
|
||||
argT1, argT2, RPLoc));
|
||||
}
|
||||
|
||||
@@ -469,22 +469,8 @@ Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
|
||||
|
||||
Sema::OwningExprResult
|
||||
TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
|
||||
QualType Type1 = SemaRef.InstantiateType(E->getArgType1(), TemplateArgs,
|
||||
/*FIXME:*/ E->getBuiltinLoc(),
|
||||
DeclarationName());
|
||||
if (Type1.isNull())
|
||||
return SemaRef.ExprError();
|
||||
|
||||
QualType Type2 = SemaRef.InstantiateType(E->getArgType2(), TemplateArgs,
|
||||
/*FIXME:*/ E->getBuiltinLoc(),
|
||||
DeclarationName());
|
||||
if (Type2.isNull())
|
||||
return SemaRef.ExprError();
|
||||
|
||||
return SemaRef.ActOnTypesCompatibleExpr(E->getBuiltinLoc(),
|
||||
Type1.getAsOpaquePtr(),
|
||||
Type2.getAsOpaquePtr(),
|
||||
E->getRParenLoc());
|
||||
assert(false && "__builtin_types_compatible_p is not legal in C++");
|
||||
return SemaRef.ExprError();
|
||||
}
|
||||
|
||||
Sema::OwningExprResult
|
||||
|
||||
5
clang/test/SemaCXX/types_compatible_p.cpp
Normal file
5
clang/test/SemaCXX/types_compatible_p.cpp
Normal file
@@ -0,0 +1,5 @@
|
||||
// RUN: clang-cc -fsyntax-only -verify %s
|
||||
|
||||
bool f() {
|
||||
return __builtin_types_compatible_p(int, const int); // expected-error{{C++}}
|
||||
}
|
||||
@@ -70,18 +70,6 @@ struct StatementExpr0 {
|
||||
template struct StatementExpr0<int>;
|
||||
template struct StatementExpr0<N1::X>; // expected-note{{instantiation}}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// __builtin_types_compatible_p
|
||||
// ---------------------------------------------------------------------
|
||||
template<typename T, typename U, bool Result>
|
||||
struct TypesCompatible0 {
|
||||
void f() {
|
||||
int a[__builtin_types_compatible_p(T, U) == Result? 1 : -1];
|
||||
}
|
||||
};
|
||||
|
||||
template struct TypesCompatible0<int, const int, true>;
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// __builtin_shufflevector
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user