]> granicus.if.org Git - clang/commitdiff
Bug fix, apply default argument promotion in message sends for which
authorDaniel Dunbar <daniel@zuster.org>
Thu, 11 Sep 2008 00:04:36 +0000 (00:04 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 11 Sep 2008 00:04:36 +0000 (00:04 +0000)
no method declaration was found.
 - This was allowing arrays to pass "by value" among other things.

Add assert in CodeGen that arguments cannot have array type.

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

lib/CodeGen/CGCall.cpp
lib/Sema/SemaExprObjC.cpp

index bbe43703cbf459277540f34110495bc0dc0a84e9..b4eaff838594b053e99a74bf8a444f061d69352c 100644 (file)
@@ -136,6 +136,8 @@ public:
 
 static ABIArgInfo classifyReturnType(QualType RetTy,
                                      ASTContext &Context) {
+  assert(!RetTy->isArrayType() && 
+         "Array types cannot be passed directly.");
   if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
     uint64_t Size = Context.getTypeSize(RetTy);
     if (Size == 8) {
@@ -198,6 +200,8 @@ CodeGenTypes::GetFunctionType(ArgTypeIterator begin, ArgTypeIterator end,
   
   for (++begin; begin != end; ++begin) {
     const llvm::Type *Ty = ConvertType(*begin);
+    assert(!(*begin)->isArrayType() && 
+           "Array types cannot be passed directly.");
     if (Ty->isSingleValueType())
       ArgTys.push_back(Ty);
     else
@@ -254,6 +258,8 @@ void CodeGenModule::ConstructParamAttrList(const Decl *TargetDecl,
   for (++begin; begin != end; ++begin, ++Index) {
     QualType ParamType = *begin;
     unsigned ParamAttrs = 0;
+    assert(!ParamType->isArrayType() && 
+           "Array types cannot be passed directly.");
     if (ParamType->isRecordType())
       ParamAttrs |= llvm::ParamAttr::ByVal;
     if (ParamType->isPromotableIntegerType()) {
index 0d3bc298400b966f4e28f7f63bbfc9f98e6fe2a1..08177e6769635aeaa12f2b2f1a7d5d88c411b73f 100644 (file)
@@ -114,6 +114,10 @@ bool Sema::CheckMessageArgumentTypes(Expr **Args, Selector Sel,
                                      QualType &ReturnType) {  
   unsigned NumArgs = Sel.getNumArgs();  
   if (!Method) {
+    // Apply default argument promotion as for (C99 6.5.2.2p6).
+    for (unsigned i = 0; i != NumArgs; i++)
+      DefaultArgumentPromotion(Args[i]);
+
     Diag(lbrac, diag::warn_method_not_found, std::string(PrefixStr),
          Sel.getName(), SourceRange(lbrac, rbrac));
     ReturnType = Context.getObjCIdType();