diff options
-rw-r--r-- | clang/lib/CodeGen/TargetABIInfo.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGen/arm-arguments.c | 14 |
2 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/TargetABIInfo.cpp b/clang/lib/CodeGen/TargetABIInfo.cpp index 1dd88bb4812..c403960580a 100644 --- a/clang/lib/CodeGen/TargetABIInfo.cpp +++ b/clang/lib/CodeGen/TargetABIInfo.cpp @@ -1430,6 +1430,10 @@ static bool isIntegerLikeType(QualType Ty, if (Ty->isVectorType()) return false; + // Float types are never treated as "integer like". + if (Ty->isRealFloatingType()) + return false; + // If this is a builtin or pointer type then it is ok. if (Ty->getAsBuiltinType() || Ty->isPointerType()) return true; diff --git a/clang/test/CodeGen/arm-arguments.c b/clang/test/CodeGen/arm-arguments.c index 0448f92aa41..e58d2fddefc 100644 --- a/clang/test/CodeGen/arm-arguments.c +++ b/clang/test/CodeGen/arm-arguments.c @@ -70,3 +70,17 @@ struct s11 f11(void) {} // AAPCS: define arm_aapcscc i32 @f12() union u12 { char f0; short f1; int f2; }; union u12 f12(void) {} + +// APCS-GNU: define arm_apcscc void @f13( +// APCS-GNU: struct.s13* noalias sret + +// FIXME: This should return a float. +// AAPCS-FIXME: define arm_aapcscc float @f13() +struct s13 { float f0; }; +struct s13 f13(void) {} + +// APCS-GNU: define arm_apcscc void @f14( +// APCS-GNU: struct.s13* noalias sret +// AAPCS: define arm_aapcscc i32 @f14() +union u14 { float f0; }; +union u14 f14(void) {} |