]> granicus.if.org Git - clang/commitdiff
Simplified setting up Method's scope before generating AST for its nody.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 4 Dec 2007 19:20:11 +0000 (19:20 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 4 Dec 2007 19:20:11 +0000 (19:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44576 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/Sema.h
Sema/SemaChecking.cpp
Sema/SemaDecl.cpp
Sema/SemaStmt.cpp
Sema/SemaType.cpp
include/clang/AST/Expr.h

index 590f46f155a58f4cb24c7e05c4790f14511df288..00133f885ab83f19e24d60ff14fbc1e0259c43fa 100644 (file)
@@ -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);
index 81a18c9645f6575b43c3104bc6f2ab98917429e8..b83e5120a1c73ba6d2f15164f671fc07699ea283 100644 (file)
@@ -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;
       }
index 920d9917d6f8fac839abd22578f612d8f35c1539..e2b1fdf134dacba5ddb23c675beea73d1c316aca 100644 (file)
@@ -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
index d00501ae0a2c1d686861fa59ceb1093e77df4ee5..732339244da4c85d4ed4c891b8787b0f846a88e0 100644 (file)
@@ -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
index b9592fc6c2d8fee9d0fb61cdc4e42afe81108c31..4eefabfe6c28eeeb8bb9a0469552c9e50b1a237e 100644 (file)
@@ -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;
index 6630a7f2604559f5dcffc265a8a9b717cb406bd0..7e05538c6a4fed9e9b0737e75b93ea20905d4a55 100644 (file)
@@ -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"