]> granicus.if.org Git - clang/commitdiff
When a function template's template parameter has a default argument,
authorDouglas Gregor <dgregor@apple.com>
Fri, 4 Feb 2011 03:57:22 +0000 (03:57 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 4 Feb 2011 03:57:22 +0000 (03:57 +0000)
it's okay for the following template parameters to not have default
arguments (since those template parameters can still be
deduced). Also, downgrade the error about default template arguments
in function templates to an extension warning, since this is a
harmless C++0x extension.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124855 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaTemplate.cpp
test/CXX/temp/temp.param/p11-0x.cpp
test/CXX/temp/temp.param/p9.cpp

index 2c8ccbdfb39d16ac6a5baeb63c885930ffbb5447..0df95a254f94300d02c71e8d88b015dbb6de79da 100644 (file)
@@ -1476,9 +1476,9 @@ def note_template_param_prev_default_arg : Note<
   "previous default template argument defined here">;
 def err_template_param_default_arg_missing : Error<
   "template parameter missing a default argument">;
-def err_template_parameter_default_in_function_template : Error<
-  "a template parameter of a function template cannot have a default argument "
-  "in C++98">;
+def ext_template_parameter_default_in_function_template : ExtWarn<
+  "default template arguments for a function template are a C++0x extension">,
+  InGroup<CXX0x>;
 def err_template_parameter_default_template_member : Error<
   "cannot add a default template argument to the definition of a member of a "
   "class template">;
index 00f490cfad7880929d16ae768def19af0397e1d0..f7060f03a3b886881dd22cb3915e8ae63a6d35da 100644 (file)
@@ -1052,7 +1052,7 @@ static bool DiagnoseDefaultTemplateArgument(Sema &S,
     // (This sentence is not in C++0x, per DR226).
     if (!S.getLangOptions().CPlusPlus0x)
       S.Diag(ParamLoc,
-             diag::err_template_parameter_default_in_function_template)
+             diag::ext_template_parameter_default_in_function_template)
         << DefArgRange;
     return false;
 
@@ -1315,7 +1315,7 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
       Diag(NewDefaultLoc, diag::err_template_param_default_arg_redefinition);
       Diag(OldDefaultLoc, diag::note_template_param_prev_default_arg);
       Invalid = true;
-    } else if (MissingDefaultArg) {
+    } else if (MissingDefaultArg && TPC != TPC_FunctionTemplate) {
       // C++ [temp.param]p11:
       //   If a template-parameter of a class template has a default
       //   template-argument, each subsequent template-parameter shall either
index d31a1f05fe8302093b844641d19c8a7b84f026aa..0bf4341cf8d779f56bb673ea053af33f6f076718 100644 (file)
@@ -46,3 +46,16 @@ void f1nt(X1nt<V, Values...>);
 
 template<template<int> class... Meta, template<int> class M> 
 void f1tt(X1tt<M, Meta...>);
+
+namespace DefaultTemplateArgsInFunction {
+  template<typename T = int, typename U>  T &f0(U) { T *x = 0; return *x; }
+
+  void test_f0() {
+    int &ir0 = f0(3.14159);
+    int &ir1 = f0<int>(3.14159);
+    float &fr0 = f0<float>(3.14159);
+  }
+
+  template<> int &f0(int*);
+  template int &f0(double&);
+}
index 625477c4e7b68af41ccb8f2cc40f69ba5b98bac7..62af522cd2c9bf69ad05b2e74e93470d6b7426c9 100644 (file)
@@ -2,9 +2,9 @@
 
 // A default template-argument shall not be specified in a function
 // template declaration or a function template definition
-template<typename T = int> // expected-error{{cannot have a default argument}}
+template<typename T = int> // expected-warning{{default template arguments for a function template are a C++0x extension}}
   void foo0(T); 
-template<typename T = int> // expected-error{{cannot have a default argument}} 
+template<typename T = int> // expected-warning{{default template arguments for a function template are a C++0x extension}} 
   void foo1(T) { } 
 
 // [...] nor in the template-parameter-list of the definition of a