diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 15 | ||||
| -rw-r--r-- | clang/test/CodeGen/builtins.c | 18 | 
2 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 7029711d446..e60dfd3452c 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -607,12 +607,25 @@ bool Sema::SemaBuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs) {    if (OrigArg->isTypeDependent())      return false; -  // This operation requires a floating-point number +  // This operation requires a non-_Complex floating-point number.    if (!OrigArg->getType()->isRealFloatingType())      return Diag(OrigArg->getLocStart(),                  diag::err_typecheck_call_invalid_unary_fp)        << OrigArg->getType() << OrigArg->getSourceRange(); +  // If this is an implicit conversion from float -> double, remove it. +  if (ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(OrigArg)) { +    Expr *CastArg = Cast->getSubExpr(); +    if (CastArg->getType()->isSpecificBuiltinType(BuiltinType::Float)) { +      assert(Cast->getType()->isSpecificBuiltinType(BuiltinType::Double) && +             "promotion from float to double is the only expected cast here"); +      Cast->setSubExpr(0); +      Cast->Destroy(Context); +      TheCall->setArg(NumArgs-1, CastArg); +      OrigArg = CastArg; +    } +  } +      return false;  } diff --git a/clang/test/CodeGen/builtins.c b/clang/test/CodeGen/builtins.c index a4424d77428..e604fbe3189 100644 --- a/clang/test/CodeGen/builtins.c +++ b/clang/test/CodeGen/builtins.c @@ -163,3 +163,21 @@ void bar() {  }  // CHECK: } + + +// CHECK: define void @test_inff +void test_inff(float F, double D, long double LD) { +  volatile int res; +  res = __builtin_isinf(F); +  // CHECK:  call float @fabsf(float +  // CHECK:  fcmp oeq float {{.*}}, 0x7FF0000000000000 + +  res = __builtin_isinf(D); +  // CHECK:  call double @fabs(double +  // CHECK:  fcmp oeq double {{.*}}, 0x7FF0000000000000 +   +  res = __builtin_isinf(LD); +  // CHECK:  call x86_fp80 @fabsl(x86_fp80 +  // CHECK:  fcmp oeq x86_fp80 {{.*}}, 0xK7FFF8000000000000000 +} +  | 

