diff options
-rw-r--r-- | Sema/Sema.h | 2 | ||||
-rw-r--r-- | Sema/SemaChecking.cpp | 12 | ||||
-rw-r--r-- | Sema/SemaDecl.cpp | 32 | ||||
-rw-r--r-- | Sema/SemaStmt.cpp | 12 | ||||
-rw-r--r-- | Sema/SemaType.cpp | 2 | ||||
-rw-r--r-- | include/clang/AST/Expr.h | 1 |
6 files changed, 23 insertions, 38 deletions
diff --git a/Sema/Sema.h b/Sema/Sema.h index 590f46f155..00133f885a 100644 --- a/Sema/Sema.h +++ b/Sema/Sema.h @@ -170,7 +170,7 @@ public: // QualType GetTypeForDeclarator(Declarator &D, Scope *S); - QualType ObjcGetTypeForMethodDefinition(DeclTy *D, Scope *S); + QualType ObjcGetTypeForMethodDefinition(DeclTy *D); virtual TypeResult ActOnTypeName(Scope *S, Declarator &D); diff --git a/Sema/SemaChecking.cpp b/Sema/SemaChecking.cpp index 81a18c9645..b83e5120a1 100644 --- a/Sema/SemaChecking.cpp +++ b/Sema/SemaChecking.cpp @@ -54,8 +54,9 @@ Sema::CheckFunctionCall(Expr *Fn, return true; } - FunctionTypeProto* proto = - cast<FunctionTypeProto>(CurFunctionDecl->getType()); + FunctionTypeProto* proto = CurFunctionDecl ? + cast<FunctionTypeProto>(CurFunctionDecl->getType()) : + cast<FunctionTypeProto>(ObjcGetTypeForMethodDefinition(CurMethodDecl)); if (!proto->isVariadic()) { Diag(Fn->getLocStart(), diag::err_va_start_used_in_non_variadic_function); @@ -65,9 +66,10 @@ Sema::CheckFunctionCall(Expr *Fn, bool SecondArgIsLastNamedArgument = false; if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(Args[1])) { if (ParmVarDecl *PV = dyn_cast<ParmVarDecl>(DR->getDecl())) { - ParmVarDecl *LastNamedArg = - CurFunctionDecl->getParamDecl(CurFunctionDecl->getNumParams() - 1); - + ParmVarDecl *LastNamedArg = CurFunctionDecl ? + CurFunctionDecl->getParamDecl(CurFunctionDecl->getNumParams() - 1) : + CurMethodDecl->getParamDecl(CurMethodDecl->getNumParams() - 1); + if (PV == LastNamedArg) SecondArgIsLastNamedArgument = true; } diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp index 920d9917d6..e2b1fdf134 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -963,32 +963,11 @@ void Sema::ObjcActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) { ObjcMethodDecl *MDecl = dyn_cast<ObjcMethodDecl>(static_cast<Decl *>(D)); assert(MDecl != 0 && "Not a method declarator!"); - Scope *GlobalScope = FnBodyScope->getParent(); - - // build [classname selector-name] for the name of method. - std::string Name = "["; - Name += MDecl->getClassInterface()->getName(); - Name += " "; - Name += MDecl->getSelector().getName(); - Name += "]"; - IdentifierInfo *II = &Context.Idents.get(Name); - assert (II && "ObjcActOnStartOfMethodDef - selector name is missing"); - - QualType R = ObjcGetTypeForMethodDefinition(MDecl, GlobalScope); - assert(!R.isNull() && "ObjcActOnStartOfMethodDef() returned null type"); - - FunctionDecl *NewFD = new FunctionDecl(MDecl->getLocation(), II, R, - FunctionDecl::Static, false, 0); - NewFD->setNext(II->getFETokenInfo<ScopedDecl>()); - II->setFETokenInfo(NewFD); - GlobalScope->AddDecl(NewFD); - // Allow all of Sema to see that we are entering a method definition. CurMethodDecl = MDecl; - CurFunctionDecl = NewFD; - // Create Decl objects for each parameter, adding them to the FunctionDecl. - llvm::SmallVector<ParmVarDecl*, 16> Params; + // Create Decl objects for each parameter, entrring them in the scope for + // binding to their use. struct DeclaratorChunk::ParamInfo PI; // Insert the invisible arguments, self and _cmd! @@ -1001,20 +980,19 @@ void Sema::ObjcActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) { PI.TypeInfo = selfTy.getAsOpaquePtr(); } else PI.TypeInfo = Context.getObjcIdType().getAsOpaquePtr(); - Params.push_back(ActOnParamDeclarator(PI, FnBodyScope)); + ActOnParamDeclarator(PI, FnBodyScope); PI.Ident = &Context.Idents.get("_cmd"); PI.TypeInfo = Context.getObjcSelType().getAsOpaquePtr(); - Params.push_back(ActOnParamDeclarator(PI, FnBodyScope)); + ActOnParamDeclarator(PI, FnBodyScope); for (int i = 0; i < MDecl->getNumParams(); i++) { ParmVarDecl *PDecl = MDecl->getParamDecl(i); PI.Ident = PDecl->getIdentifier(); PI.IdentLoc = PDecl->getLocation(); // user vars have a real location. PI.TypeInfo = PDecl->getType().getAsOpaquePtr(); - Params.push_back(ActOnParamDeclarator(PI, FnBodyScope)); + ActOnParamDeclarator(PI, FnBodyScope); } - NewFD->setParams(&Params[0], Params.size()); } /// ImplicitlyDefineFunction - An undeclared identifier was used in a function diff --git a/Sema/SemaStmt.cpp b/Sema/SemaStmt.cpp index d00501ae0a..732339244d 100644 --- a/Sema/SemaStmt.cpp +++ b/Sema/SemaStmt.cpp @@ -580,17 +580,21 @@ Sema::ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope) { Action::StmtResult Sema::ActOnReturnStmt(SourceLocation ReturnLoc, ExprTy *rex) { Expr *RetValExp = static_cast<Expr *>(rex); - QualType lhsType = CurFunctionDecl->getResultType(); + QualType lhsType = CurFunctionDecl ? CurFunctionDecl->getResultType() : + CurMethodDecl->getResultType(); if (lhsType->isVoidType()) { if (RetValExp) // C99 6.8.6.4p1 (ext_ since GCC warns) - Diag(ReturnLoc, diag::ext_return_has_expr, - CurFunctionDecl->getIdentifier()->getName(), + Diag(ReturnLoc, diag::ext_return_has_expr, + (CurFunctionDecl ? CurFunctionDecl->getIdentifier()->getName() : + CurMethodDecl->getSelector().getName()), RetValExp->getSourceRange()); return new ReturnStmt(ReturnLoc, RetValExp); } else { if (!RetValExp) { - const char *funcName = CurFunctionDecl->getIdentifier()->getName(); + const char *funcName = CurFunctionDecl ? + CurFunctionDecl->getIdentifier()->getName() : + CurMethodDecl->getSelector().getName().c_str(); if (getLangOptions().C99) // C99 6.8.6.4p1 (ext_ since GCC warns) Diag(ReturnLoc, diag::ext_return_missing_expr, funcName); else // C90 6.6.6.4p4 diff --git a/Sema/SemaType.cpp b/Sema/SemaType.cpp index b9592fc6c2..4eefabfe6c 100644 --- a/Sema/SemaType.cpp +++ b/Sema/SemaType.cpp @@ -327,7 +327,7 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) { /// ObjcGetTypeForMethodDefinition - Builds the type for a method definition /// declarator -QualType Sema::ObjcGetTypeForMethodDefinition(DeclTy *D, Scope *S) { +QualType Sema::ObjcGetTypeForMethodDefinition(DeclTy *D) { ObjcMethodDecl *MDecl = dyn_cast<ObjcMethodDecl>(static_cast<Decl *>(D)); QualType T = MDecl->getResultType(); llvm::SmallVector<QualType, 16> ArgTys; diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 6630a7f260..7e05538c6a 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -17,6 +17,7 @@ #include "clang/AST/Stmt.h" #include "clang/AST/Type.h" #include "clang/AST/Decl.h" +#include "clang/AST/DeclObjC.h" #include "clang/Basic/IdentifierTable.h" #include "llvm/ADT/APSInt.h" #include "llvm/ADT/APFloat.h" |