diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-08-22 00:34:47 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-08-22 00:34:47 +0000 |
commit | d83d04041f64a2c89123d227fa8003b482391279 (patch) | |
tree | cff3c814385b448dfc048774b1ba787dfd188f0b /lib/Sema/SemaDecl.cpp | |
parent | c141086bff9c2809aa46efdc5ce66756430f3470 (diff) |
Implement delayed parsing for member function templates. Fixes PR4608.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79709 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDecl.cpp')
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 4017772083..6668aeaac5 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3526,7 +3526,13 @@ Sema::DeclPtrTy Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Sema::DeclPtrTy Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclPtrTy D) { if (!D) return D; - FunctionDecl *FD = cast<FunctionDecl>(D.getAs<Decl>()); + FunctionDecl *FD = 0; + + if (FunctionTemplateDecl *FunTmpl + = dyn_cast<FunctionTemplateDecl>(D.getAs<Decl>())) + FD = FunTmpl->getTemplatedDecl(); + else + FD = cast<FunctionDecl>(D.getAs<Decl>()); CurFunctionNeedsScopeChecking = false; @@ -3624,7 +3630,15 @@ Sema::DeclPtrTy Sema::ActOnFinishFunctionBody(DeclPtrTy D, StmtArg BodyArg, bool IsInstantiation) { Decl *dcl = D.getAs<Decl>(); Stmt *Body = BodyArg.takeAs<Stmt>(); - if (FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(dcl)) { + + FunctionDecl *FD = 0; + FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(dcl); + if (FunTmpl) + FD = FunTmpl->getTemplatedDecl(); + else + FD = dyn_cast_or_null<FunctionDecl>(dcl); + + if (FD) { FD->setBody(Body); if (FD->isMain(Context)) // C and C++ allow for main to automagically return 0. @@ -3711,7 +3725,7 @@ Sema::DeclPtrTy Sema::ActOnFinishFunctionBody(DeclPtrTy D, StmtArg BodyArg, // C++ constructors that have function-try-blocks can't have return // statements in the handlers of that block. (C++ [except.handle]p14) // Verify this. - if (isa<CXXConstructorDecl>(dcl) && isa<CXXTryStmt>(Body)) + if (FD && isa<CXXConstructorDecl>(FD) && isa<CXXTryStmt>(Body)) DiagnoseReturnInConstructorExceptionHandler(cast<CXXTryStmt>(Body)); if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(dcl)) |