diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-07-22 03:31:14 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-07-22 03:31:14 +0000 |
| commit | 35828f1db6a9a48da8abb83439200d37c91d6d90 (patch) | |
| tree | 9e3b8d79f78232b7c4b94606a001e7c7838634f4 /clang | |
| parent | bc46e4341e954a47dbb86e272847ab65fcdcc44f (diff) | |
| download | bcm5719-llvm-35828f1db6a9a48da8abb83439200d37c91d6d90.tar.gz bcm5719-llvm-35828f1db6a9a48da8abb83439200d37c91d6d90.zip | |
PR16288: A template is only missing a default template argument if it provides
any default template arguments, not if it inherits some.
llvm-svn: 186804
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 5 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/default-arguments.cpp | 11 |
2 files changed, 12 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index decac1dfc57..af0eb08f203 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -1319,7 +1319,6 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams, } else if (OldTypeParm && OldTypeParm->hasDefaultArgument()) { // Merge the default argument from the old declaration to the // new declaration. - SawDefaultArgument = true; NewTypeParm->setDefaultArgument(OldTypeParm->getDefaultArgumentInfo(), true); PreviousDefaultArgLoc = OldTypeParm->getDefaultArgumentLoc(); @@ -1356,7 +1355,7 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams, if (!NewNonTypeParm->isPackExpansion()) SawParameterPack = true; } else if (OldNonTypeParm && OldNonTypeParm->hasDefaultArgument() && - NewNonTypeParm->hasDefaultArgument()) { + NewNonTypeParm->hasDefaultArgument()) { OldDefaultLoc = OldNonTypeParm->getDefaultArgumentLoc(); NewDefaultLoc = NewNonTypeParm->getDefaultArgumentLoc(); SawDefaultArgument = true; @@ -1365,7 +1364,6 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams, } else if (OldNonTypeParm && OldNonTypeParm->hasDefaultArgument()) { // Merge the default argument from the old declaration to the // new declaration. - SawDefaultArgument = true; // FIXME: We need to create a new kind of "default argument" // expression that points to a previous non-type template // parameter. @@ -1413,7 +1411,6 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams, } else if (OldTemplateParm && OldTemplateParm->hasDefaultArgument()) { // Merge the default argument from the old declaration to the // new declaration. - SawDefaultArgument = true; // FIXME: We need to create a new kind of "default argument" expression // that points to a previous template template parameter. NewTemplateParm->setDefaultArgument( diff --git a/clang/test/SemaTemplate/default-arguments.cpp b/clang/test/SemaTemplate/default-arguments.cpp index 6391369aa5c..aca5c972adb 100644 --- a/clang/test/SemaTemplate/default-arguments.cpp +++ b/clang/test/SemaTemplate/default-arguments.cpp @@ -136,3 +136,14 @@ namespace PR9643 { vector<int, allocator<int> > v = initializer<vector>(5); } } + +namespace PR16288 { + template<typename X> + struct S { + template<typename T = int, typename U> // expected-warning {{C++11}} + void f(); + }; + template<typename X> + template<typename T, typename U> + void S<X>::f() {} +} |

