diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-03-03 04:44:36 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-03-03 04:44:36 +0000 |
| commit | 463421deb1c3b6e5e41dba132853645cdd260195 (patch) | |
| tree | f3ea367fd8b21403ab75a3f18a9adb14140db4f6 /clang/lib/Sema/Sema.h | |
| parent | 9c51e8f962d5d7bf7fabd7cbdd47770709228a2c (diff) | |
| download | bcm5719-llvm-463421deb1c3b6e5e41dba132853645cdd260195.tar.gz bcm5719-llvm-463421deb1c3b6e5e41dba132853645cdd260195.zip | |
Implement the basics of implicit instantiation of class templates, in
response to attempts to diagnose an "incomplete" type. This will force
us to use DiagnoseIncompleteType more regularly (rather than looking at
isIncompleteType), but that's also a good thing.
Implicit instantiation is still very simplistic, and will create a new
definition for the class template specialization (as it should) but it
only actually instantiates the base classes and attaches
those. Actually instantiating class members will follow.
Also, instantiate the types of non-type template parameters before
checking them, allowing, e.g.,
template<typename T, T Value> struct Constant;
to work properly.
llvm-svn: 65924
Diffstat (limited to 'clang/lib/Sema/Sema.h')
| -rw-r--r-- | clang/lib/Sema/Sema.h | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index b9cce4b215c..77f2a3d8b69 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -1501,11 +1501,19 @@ public: // /// ActOnBaseSpecifier - Parsed a base specifier + CXXBaseSpecifier *CheckBaseSpecifier(CXXRecordDecl *Class, + SourceRange SpecifierRange, + bool Virtual, AccessSpecifier Access, + QualType BaseType, + SourceLocation BaseLoc); virtual BaseResult ActOnBaseSpecifier(DeclTy *classdecl, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, - TypeTy *basetype, SourceLocation BaseLoc); + TypeTy *basetype, SourceLocation + BaseLoc); + bool AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases, + unsigned NumBases); virtual void ActOnBaseSpecifiers(DeclTy *ClassDecl, BaseTy **Bases, unsigned NumBases); @@ -1542,6 +1550,7 @@ public: SourceLocation DefaultLoc, TypeTy *Default); + QualType CheckNonTypeTemplateParameterType(QualType T, SourceLocation Loc); virtual DeclTy *ActOnNonTypeTemplateParameter(Scope *S, Declarator &D, unsigned Depth, unsigned Position); @@ -1615,7 +1624,8 @@ public: bool CheckTemplateArgumentAddressOfObjectOrFunction(Expr *Arg, NamedDecl *&Entity); bool CheckTemplateArgumentPointerToMember(Expr *Arg, NamedDecl *&Member); - bool CheckTemplateArgument(NonTypeTemplateParmDecl *Param, Expr *&Arg, + bool CheckTemplateArgument(NonTypeTemplateParmDecl *Param, + QualType InstantiatedParamType, Expr *&Arg, llvm::SmallVectorImpl<TemplateArgument> *Converted = 0); bool CheckTemplateArgument(TemplateTemplateParmDecl *Param, DeclRefExpr *Arg); bool TemplateParameterListsAreEqual(TemplateParameterList *New, @@ -1634,6 +1644,13 @@ public: QualType InstantiateType(QualType T, const TemplateArgument *TemplateArgs, unsigned NumTemplateArgs, SourceLocation Loc, DeclarationName Entity); + bool + InstantiateBaseSpecifiers(ClassTemplateSpecializationDecl *ClassTemplateSpec, + ClassTemplateDecl *ClassTemplate); + bool + InstantiateClassTemplateSpecialization( + ClassTemplateSpecializationDecl *ClassTemplateSpec, + bool ExplicitInstantiation); // Objective-C declarations. virtual DeclTy *ActOnStartClassInterface(SourceLocation AtInterfaceLoc, |

