So did I. Probably we should update llvm core at this time. - fj
On Jul 22, 2009, at 6:01 PM, steve naroff wrote: > Hi Doug, > > I recently started getting a boatload of warnings like the > following... > > Any clue? > > snaroff > > llvm[2]: Compiling SemaOverload.cpp for Debug build > /Users/snaroff/llvm/tools/clang/lib/Sema/../../include/clang/Parse/ > Action.h:422: warning: ‘virtual clang::OpaquePtr<0> > clang::Action::ActOnTag(clang::Scope*, unsigned int, > clang::Action::TagKind, clang::SourceLocation, const > clang::CXXScopeSpec&, clang::IdentifierInfo*, clang::SourceLocation, > clang::AttributeList*, clang::AccessSpecifier, bool&)’ was hidden > Sema.h:526: warning: by ‘virtual clang::OpaquePtr<0> > clang::Sema::ActOnTag(clang::Scope*, unsigned int, > clang::Action::TagKind, clang::SourceLocation, const > clang::CXXScopeSpec&, clang::IdentifierInfo*, clang::SourceLocation, > clang::AttributeList*, clang::AccessSpecifier, > clang::ASTMultiPtr<&clang::ActionBase::DeleteTemplateParams>, bool&)’ > llvm[2]: Compiling SemaStmt.cpp for Debug build > /Users/snaroff/llvm/tools/clang/lib/Sema/../../include/clang/Parse/ > Action.h:422: warning: ‘virtual clang::OpaquePtr<0> > clang::Action::ActOnTag(clang::Scope*, unsigned int, > clang::Action::TagKind, clang::SourceLocation, const > clang::CXXScopeSpec&, clang::IdentifierInfo*, clang::SourceLocation, > clang::AttributeList*, clang::AccessSpecifier, bool&)’ was hidden > Sema.h:526: warning: by ‘virtual clang::OpaquePtr<0> > clang::Sema::ActOnTag(clang::Scope*, unsigned int, > clang::Action::TagKind, clang::SourceLocation, const > clang::CXXScopeSpec&, clang::IdentifierInfo*, clang::SourceLocation, > clang::AttributeList*, clang::AccessSpecifier, > clang::ASTMultiPtr<&clang::ActionBase::DeleteTemplateParams>, bool&)’ > llvm[2]: Compiling SemaTemplate.cpp for Debug build > /Users/snaroff/llvm/tools/clang/lib/Sema/../../include/clang/Parse/ > Action.h:422: warning: ‘virtual clang::OpaquePtr<0> > clang::Action::ActOnTag(clang::Scope*, unsigned int, > clang::Action::TagKind, clang::SourceLocation, const > clang::CXXScopeSpec&, clang::IdentifierInfo*, clang::SourceLocation, > clang::AttributeList*, clang::AccessSpecifier, bool&)’ was hidden > Sema.h:526: warning: by ‘virtual clang::OpaquePtr<0> > clang::Sema::ActOnTag(clang::Scope*, unsigned int, > clang::Action::TagKind, clang::SourceLocation, const > clang::CXXScopeSpec&, clang::IdentifierInfo*, clang::SourceLocation, > clang::AttributeList*, clang::AccessSpecifier, > clang::ASTMultiPtr<&clang::ActionBase::DeleteTemplateParams>, bool&)’ > > On Jul 22, 2009, at 7:48 PM, Douglas Gregor wrote: > >> Author: dgregor >> Date: Wed Jul 22 18:48:44 2009 >> New Revision: 76820 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=76820&view=rev >> Log: >> Implement support for out-of-line definitions of the class members >> of class >> templates, e.g., >> >> template<typename T> >> struct Outer { >> struct Inner; >> }; >> >> template<typename T> >> struct Outer<T>::Inner { >> // ... >> }; >> >> Implementing this feature required some extensions to ActOnTag, which >> now takes a set of template parameter lists, and is the precursor to >> removing the ActOnClassTemplate function from the parser Action >> interface. The reason for this approach is simple: the parser cannot >> tell the difference between a class template definition and the >> definition of a member of a class template; both have template >> parameter lists, and semantic analysis determines what that template >> parameter list means. >> >> There is still some cleanup to do with ActOnTag and >> ActOnClassTemplate. This commit provides the basic functionality we >> need, however. >> >> >> Added: >> cfe/trunk/test/CXX/temp/temp.decls/temp.class/temp.mem.class/p1.cpp >> Modified: >> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >> cfe/trunk/include/clang/Parse/Action.h >> cfe/trunk/lib/Parse/ParseDeclCXX.cpp >> cfe/trunk/lib/Parse/ParseTemplate.cpp >> cfe/trunk/lib/Sema/Sema.h >> cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp >> cfe/trunk/lib/Sema/SemaDecl.cpp >> cfe/trunk/lib/Sema/SemaTemplate.cpp >> cfe/trunk/test/Parser/cxx-template-decl.cpp >> >> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=76820&r1=76819&r2=76820&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) >> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Jul 22 >> 18:48:44 2009 >> @@ -733,10 +733,11 @@ >> "previous default template argument defined here">; >> def err_template_param_default_arg_missing : Error< >> "template parameter missing a default argument">; >> - >> + >> def err_template_variable : Error<"variable %0 declared as a >> template">; >> def err_template_variable_noparams : Error< >> "extraneous 'template<>' in declaration of variable %0">; >> + >> // C++ Template Argument Lists >> def err_template_arg_list_different_arity : Error< >> "%select{too few|too many}0 template arguments for " >> >> Modified: cfe/trunk/include/clang/Parse/Action.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=76820&r1=76819&r2=76820&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/include/clang/Parse/Action.h (original) >> +++ cfe/trunk/include/clang/Parse/Action.h Wed Jul 22 18:48:44 2009 >> @@ -422,6 +422,18 @@ >> bool &OwnedDecl) { >> // TagType is an instance of DeclSpec::TST, indicating what kind >> of tag this >> // is (struct/union/enum/class). >> + return ActOnTag(S, TagSpec, TK, KWLoc, SS, Name, NameLoc, Attr, >> AS, >> + MultiTemplateParamsArg(*this, 0, 0), OwnedDecl); >> + } >> + >> + virtual DeclPtrTy ActOnTag(Scope *S, unsigned TagSpec, TagKind TK, >> + SourceLocation KWLoc, const >> CXXScopeSpec &SS, >> + IdentifierInfo *Name, SourceLocation >> NameLoc, >> + AttributeList *Attr, AccessSpecifier >> AS, >> + MultiTemplateParamsArg >> TemplateParameterLists, >> + bool &OwnedDecl) { >> + // TagType is an instance of DeclSpec::TST, indicating what >> kind of tag this >> + // is (struct/union/enum/class). >> return DeclPtrTy(); >> } >> >> >> Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=76820&r1=76819&r2=76820&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original) >> +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Wed Jul 22 18:48:44 2009 >> @@ -673,15 +673,6 @@ >> TemplateParams? TemplateParams- >>> size() : 0)); >> } >> TemplateId->Destroy(); >> - } else if (TemplateParams && TK != Action::TK_Reference) { >> - // Class template declaration or definition. >> - TagOrTempResult = Actions.ActOnClassTemplate(CurScope, TagType, >> TK, >> - StartLoc, SS, >> Name, NameLoc, >> - Attr, >> - Action::MultiTemplateParamsArg(Actions, >> - >> &(*TemplateParams)[0], >> - >> TemplateParams->size()), >> - AS); >> } else if (TemplateInfo.Kind == >> ParsedTemplateInfo::ExplicitInstantiation && >> TK == Action::TK_Declaration) { >> // Explicit instantiation of a member of a class template >> @@ -702,7 +693,11 @@ >> >> // Declaration or definition of a class type >> TagOrTempResult = Actions.ActOnTag(CurScope, TagType, TK, >> StartLoc, SS, >> - Name, NameLoc, Attr, AS, >> Owned); >> + Name, NameLoc, Attr, AS, >> + >> Action::MultiTemplateParamsArg(Actions, >> + TemplateParams? >> &(*TemplateParams)[0] : 0, >> + TemplateParams? TemplateParams- >>> size() : 0), >> + Owned); >> } >> >> // Parse the optional base clause (C++ only). >> >> Modified: cfe/trunk/lib/Parse/ParseTemplate.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseTemplate.cpp?rev=76820&r1=76819&r2=76820&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/lib/Parse/ParseTemplate.cpp (original) >> +++ cfe/trunk/lib/Parse/ParseTemplate.cpp Wed Jul 22 18:48:44 2009 >> @@ -96,9 +96,15 @@ >> // Parse the '<' template-parameter-list '>' >> SourceLocation LAngleLoc, RAngleLoc; >> TemplateParameterList TemplateParams; >> - ParseTemplateParameters(ParamLists.size(), TemplateParams, >> LAngleLoc, >> - RAngleLoc); >> - >> + if (ParseTemplateParameters(ParamLists.size(), TemplateParams, >> LAngleLoc, >> + RAngleLoc)) { >> + // Skip until the semi-colon or a }. >> + SkipUntil(tok::r_brace, true, true); >> + if (Tok.is(tok::semi)) >> + ConsumeToken(); >> + return DeclPtrTy(); >> + } >> + >> if (!TemplateParams.empty()) >> isSpecialiation = false; >> >> @@ -219,6 +225,8 @@ >> /// The template parameter we parse will be added to this list. >> LAngleLoc and >> /// RAngleLoc will receive the positions of the '<' and '>', >> respectively, >> /// that enclose this template parameter list. >> +/// >> +/// \returns true if an error occurred, false otherwise. >> bool Parser::ParseTemplateParameters(unsigned Depth, >> TemplateParameterList >> &TemplateParams, >> SourceLocation &LAngleLoc, >> @@ -226,7 +234,7 @@ >> // Get the template parameter list. >> if(!Tok.is(tok::less)) { >> Diag(Tok.getLocation(), diag::err_expected_less_after) << >> "template"; >> - return false; >> + return true; >> } >> LAngleLoc = ConsumeToken(); >> >> @@ -236,11 +244,11 @@ >> else if(ParseTemplateParameterList(Depth, TemplateParams)) { >> if(!Tok.is(tok::greater)) { >> Diag(Tok.getLocation(), diag::err_expected_greater); >> - return false; >> + return true; >> } >> RAngleLoc = ConsumeToken(); >> } >> - return true; >> + return false; >> } >> >> /// ParseTemplateParameterList - Parse a template parameter list. If >> @@ -392,8 +400,8 @@ >> SourceLocation LAngleLoc, RAngleLoc; >> { >> ParseScope TemplateParmScope(this, Scope::TemplateParamScope); >> - if(!ParseTemplateParameters(Depth + 1, TemplateParams, >> LAngleLoc, >> - RAngleLoc)) { >> + if(ParseTemplateParameters(Depth + 1, TemplateParams, LAngleLoc, >> + RAngleLoc)) { >> return DeclPtrTy(); >> } >> } >> >> Modified: cfe/trunk/lib/Sema/Sema.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=76820&r1=76819&r2=76820&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/lib/Sema/Sema.h (original) >> +++ cfe/trunk/lib/Sema/Sema.h Wed Jul 22 18:48:44 2009 >> @@ -522,6 +522,7 @@ >> SourceLocation KWLoc, const >> CXXScopeSpec &SS, >> IdentifierInfo *Name, SourceLocation >> NameLoc, >> AttributeList *Attr, AccessSpecifier AS, >> + MultiTemplateParamsArg >> TemplateParameterLists, >> bool &OwnedDecl); >> >> virtual void ActOnDefs(Scope *S, DeclPtrTy TagD, SourceLocation >> DeclStart, >> >> Modified: cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp?rev=76820&r1=76819&r2=76820&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp Wed Jul 22 18:48:44 2009 >> @@ -213,7 +213,7 @@ >> if (!SS.isSet() || SS.isInvalid()) >> return false; >> >> - DeclContext *DC = computeDeclContext(SS); >> + DeclContext *DC = computeDeclContext(SS, true); >> if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) { >> // If we're currently defining this type, then lookup into the >> // type is okay: don't complain that it isn't complete yet. >> >> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=76820&r1=76819&r2=76820&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Jul 22 18:48:44 2009 >> @@ -1866,14 +1866,14 @@ >> } else { >> // There is an extraneous 'template<>' for this variable. >> Complain >> // about it, but allow the declaration of the variable. >> - Diag(TemplateParams->getTemplateLoc(), >> diag::err_template_variable) >> + Diag(TemplateParams->getTemplateLoc(), >> + diag::err_template_variable_noparams) >> << II >> << SourceRange(TemplateParams->getTemplateLoc(), >> TemplateParams->getRAngleLoc()); >> } >> } >> >> - // The variable can not >> NewVD = VarDecl::Create(Context, DC, D.getIdentifierLoc(), >> II, R, SC, >> // FIXME: Move to DeclGroup... >> @@ -3522,6 +3522,7 @@ >> SourceLocation KWLoc, const >> CXXScopeSpec &SS, >> IdentifierInfo *Name, SourceLocation >> NameLoc, >> AttributeList *Attr, AccessSpecifier >> AS, >> + MultiTemplateParamsArg >> TemplateParameterLists, >> bool &OwnedDecl) { >> // If this is not a definition, it must have a name. >> assert((Name != 0 || TK == TK_Definition) && >> @@ -3537,6 +3538,28 @@ >> case DeclSpec::TST_enum: Kind = TagDecl::TK_enum; break; >> } >> >> + if (TK != TK_Reference) { >> + if (TemplateParameterList *TemplateParams >> + = MatchTemplateParametersToScopeSpecifier(KWLoc, SS, >> + >> (TemplateParameterList**)TemplateParameterLists.get(), >> + >> TemplateParameterLists.size())) { >> + if (TemplateParams->size() > 0) { >> + // This is a declaration or definition of a class template >> (which may >> + // be a member of another template). >> + OwnedDecl = false; >> + DeclResult Result = ActOnClassTemplate(S, TagSpec, TK, >> KWLoc, >> + SS, Name, NameLoc, >> Attr, >> + >> move(TemplateParameterLists), >> + AS); >> + return Result.get(); >> + } else { >> + // FIXME: diagnose the extraneous 'template<>', once we >> recover >> + // slightly better in ParseTemplate.cpp from bogus template >> + // parameters. >> + } >> + } >> + } >> + >> DeclContext *SearchDC = CurContext; >> DeclContext *DC = CurContext; >> NamedDecl *PrevDecl = 0; >> >> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=76820&r1=76819&r2=76820&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Jul 22 18:48:44 2009 >> @@ -2895,7 +2895,8 @@ >> >> bool Owned = false; >> DeclPtrTy TagD = ActOnTag(S, TagSpec, Action::TK_Reference, >> - KWLoc, SS, Name, NameLoc, Attr, >> AS_none, Owned); >> + KWLoc, SS, Name, NameLoc, Attr, AS_none, >> + MultiTemplateParamsArg(*this, 0, 0), >> Owned); >> if (!TagD) >> return true; >> >> >> Added: cfe/trunk/test/CXX/temp/temp.decls/temp.class/temp.mem.class/ >> p1.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.decls/temp.class/temp.mem.class/p1.cpp?rev=76820&view=auto >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/test/CXX/temp/temp.decls/temp.class/temp.mem.class/ >> p1.cpp (added) >> +++ cfe/trunk/test/CXX/temp/temp.decls/temp.class/temp.mem.class/ >> p1.cpp Wed Jul 22 18:48:44 2009 >> @@ -0,0 +1,27 @@ >> +// RUN: clang-cc -fsyntax-only -verify %s >> + >> +template<typename T, typename U> >> +struct X0 { >> + struct Inner; >> +}; >> + >> +template<typename T, typename U> >> +struct X0<T, U>::Inner { >> + T x; >> + U y; >> + >> + void f() { x = y; } // expected-error{{incompatible}} >> +}; >> + >> + >> +void test(int i, float f) { >> + X0<int, float>::Inner inner; >> + inner.x = 5; >> + inner.y = 3.4; >> + inner.f(); >> + >> + X0<int*, float *>::Inner inner2; >> + inner2.x = &i; >> + inner2.y = &f; >> + inner2.f(); // expected-note{{instantiation}} >> +} >> \ No newline at end of file >> >> Modified: cfe/trunk/test/Parser/cxx-template-decl.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-template-decl.cpp?rev=76820&r1=76819&r2=76820&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/test/Parser/cxx-template-decl.cpp (original) >> +++ cfe/trunk/test/Parser/cxx-template-decl.cpp Wed Jul 22 18:48:44 >> 2009 >> @@ -3,12 +3,8 @@ >> // Errors >> export class foo { }; // expected-error {{expected template}} >> template x; // expected-error {{C++ requires a type >> specifier for all declarations}} >> -export template x; // expected-error {{expected '<' after >> 'template'}} \ >> - // expected-note {{exported templates are >> unsupported}} \ >> -// expected-error {{C++ requires a type specifier for all >> declarations}} \ >> -// expected-error {{declared as a template}} >> -// See Sema::ParsedFreeStandingDeclSpec about the double >> diagnostic. This is >> -// because ParseNonTypeTemplateParameter starts parsing a DeclSpec. >> +export template x; // expected-error {{expected '<' after >> 'template'}} >> +export template<class T> class x0; // expected-note {{exported >> templates are unsupported}} >> template < ; // expected-error {{parse error}} expected- >> error {{declaration does not declare anything}} >> template <template X> struct Err1; // expected-error {{expected '<' >> after 'template'}} >> template <template <typename> > struct Err2; // expected-error >> {{expected 'class' before '>'}} >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
