[cfe-commits] r124856 - in /cfe/trunk: include/clang/Sema/Sema.h lib/Sema/SemaDecl.cpp lib/Sema/SemaTemplate.cpp test/CXX/temp/temp.param/p9-0x.cpp
Nick Lewycky
nlewycky at google.com
Thu Feb 3 21:59:52 PST 2011
On 3 February 2011 20:20, Douglas Gregor <dgregor at apple.com> wrote:
> Author: dgregor
> Date: Thu Feb 3 22:20:44 2011
> New Revision: 124856
>
> URL: http://llvm.org/viewvc/llvm-project?rev=124856&view=rev
> Log:
> Tighten up the semantics of default template arguments, per C++0x
> [temp.param]p9 and C++ DR226. Fixes PR8747.
>
Hi Doug, I suspect this is the wrong PR#?
Nick
>
> Modified:
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/lib/Sema/SemaTemplate.cpp
> cfe/trunk/test/CXX/temp/temp.param/p9-0x.cpp
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=124856&r1=124855&r2=124856&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Thu Feb 3 22:20:44 2011
> @@ -2914,7 +2914,8 @@
> TPC_ClassTemplate,
> TPC_FunctionTemplate,
> TPC_ClassTemplateMember,
> - TPC_FriendFunctionTemplate
> + TPC_FriendFunctionTemplate,
> + TPC_FriendFunctionTemplateDefinition
> };
>
> bool CheckTemplateParameterList(TemplateParameterList *NewParams,
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=124856&r1=124855&r2=124856&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Feb 3 22:20:44 2011
> @@ -3967,8 +3967,14 @@
> FunctionTemplateDecl *PrevTemplate =
> FunctionTemplate->getPreviousDeclaration();
> CheckTemplateParameterList(FunctionTemplate->getTemplateParameters(),
> PrevTemplate?
> PrevTemplate->getTemplateParameters() : 0,
> - D.getDeclSpec().isFriendSpecified()?
> TPC_FriendFunctionTemplate
> - : TPC_FunctionTemplate);
> + D.getDeclSpec().isFriendSpecified()
> + ? (IsFunctionDefinition
> + ? TPC_FriendFunctionTemplateDefinition
> + : TPC_FriendFunctionTemplate)
> + : (D.getCXXScopeSpec().isSet() &&
> + DC && DC->isRecord())
> + ? TPC_ClassTemplateMember
> + : TPC_FunctionTemplate);
> }
>
> if (NewFD->isInvalidDecl()) {
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=124856&r1=124855&r2=124856&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Thu Feb 3 22:20:44 2011
> @@ -946,7 +946,10 @@
> // template declaration.
> if (CheckTemplateParameterList(TemplateParams,
> PrevClassTemplate? PrevClassTemplate->getTemplateParameters() :
> 0,
> - TPC_ClassTemplate))
> + (SS.isSet() && SemanticContext &&
> + SemanticContext->isRecord())
> + ? TPC_ClassTemplateMember
> + : TPC_ClassTemplate))
> Invalid = true;
>
> if (SS.isSet()) {
> @@ -1045,11 +1048,15 @@
> return false;
>
> case Sema::TPC_FunctionTemplate:
> + case Sema::TPC_FriendFunctionTemplateDefinition:
> // C++ [temp.param]p9:
> // A default template-argument shall not be specified in a
> // function template declaration or a function template
> // definition [...]
> - // (This sentence is not in C++0x, per DR226).
> + // If a friend function template declaration specifies a default
> + // template-argument, that declaration shall be a definition and
> shall be
> + // the only declaration of the function template in the translation
> unit.
> + // (C++98/03 doesn't have this wording; see DR226).
> if (!S.getLangOptions().CPlusPlus0x)
> S.Diag(ParamLoc,
> diag::ext_template_parameter_default_in_function_template)
>
> Modified: cfe/trunk/test/CXX/temp/temp.param/p9-0x.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.param/p9-0x.cpp?rev=124856&r1=124855&r2=124856&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CXX/temp/temp.param/p9-0x.cpp (original)
> +++ cfe/trunk/test/CXX/temp/temp.param/p9-0x.cpp Thu Feb 3 22:20:44 2011
> @@ -12,3 +12,41 @@
>
> template<template<class> class ...Templates = vector> //
> expected-error{{template parameter pack cannot have a default argument}}
> struct X2;
> +
> +struct X3 {
> + template<typename T = int> // expected-error{{default template argument
> not permitted on a friend template}}
> + friend void f0(X3);
> +
> + template<typename T = int>
> + friend void f1(X3) {
> + }
> +};
> +
> +namespace PR8747 {
> + // Testcase 1
> + struct A0 { template<typename U> struct B; };
> + template<typename U = int> struct A0::B { }; // expected-error{{cannot
> add a default template argument to the definition of a member of a class
> template}}
> +
> + // Testcase 2
> + template<typename T> struct A1 { template<typename U> struct B; };
> + template<typename T> template<typename U = int> struct A1<T>::B { }; //
> expected-error{{cannot add a default template argument to the definition of
> a member of a class template}}
> +
> + // Testcase 3
> + template<typename T>
> + struct X2 {
> + void f0();
> + template<typename U> void f1();
> + };
> +
> + template<typename T = int> void X2<T>::f0() { } //
> expected-error{{cannot add a default template argument to the definition of
> a member of a class template}}
> + template<typename T> template<typename U = int> void X2<T>::f1() { } //
> expected-error{{cannot add a default template argument to the definition of
> a member of a class template}}
> +
> + namespace Inner {
> + template<typename T> struct X3;
> + template<typename T> void f2();
> + }
> +
> + // Okay; not class members.
> + template<typename T = int> struct Inner::X3 { };
> + template<typename T = int> void Inner::f2() {}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110203/8e6ac9df/attachment.html>
More information about the cfe-commits
mailing list