[cfe-commits] r76820 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td include/clang/Parse/Action.h lib/Parse/ParseDeclCXX.cpp lib/Parse/ParseTemplate.cpp lib/Sema/Sema.h lib/Sema/SemaCXXScopeSpec.cpp lib/Sema/SemaDecl.cpp lib/Sema/SemaTemplate.cpp test/CXX/temp/temp.decls/temp.class/temp.mem.class/p1.cpp test/Parser/cxx-template-decl.cpp

steve naroff snaroff at apple.com
Wed Jul 22 18:01:09 PDT 2009


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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list