]> granicus.if.org Git - clang/commitdiff
[clang] Fixing incorrect implicit deduction guides (PR41549)
authorGauthier Harnisch <tyker1@outlook.com>
Fri, 14 Jun 2019 08:40:04 +0000 (08:40 +0000)
committerGauthier Harnisch <tyker1@outlook.com>
Fri, 14 Jun 2019 08:40:04 +0000 (08:40 +0000)
Summary:
[[ https://bugs.llvm.org/show_bug.cgi?id=41549 | bug report ]]

Before this patch, implicit deduction guides were generated from the first declaration found by lookup.
With this patch implicit deduction guides are generated from the definition of the class template.
Also added test that was previously failing.

Reviewers: rsmith

Reviewed By: rsmith

Subscribers: cfe-commits, Quuxplusone

Tags: #clang

Differential Revision: https://reviews.llvm.org/D63072

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

lib/Sema/SemaTemplate.cpp
test/SemaCXX/cxx1z-class-template-argument-deduction.cpp

index 2483a28b252f0dceb9017d9f7a9b2d53dd50ae23..f7f3ccc3e2f644326f0168b77c625d1766a32c41 100644 (file)
@@ -2052,6 +2052,12 @@ private:
 
 void Sema::DeclareImplicitDeductionGuides(TemplateDecl *Template,
                                           SourceLocation Loc) {
+  if (CXXRecordDecl *DefRecord =
+          cast<CXXRecordDecl>(Template->getTemplatedDecl())->getDefinition()) {
+    TemplateDecl *DescribedTemplate = DefRecord->getDescribedClassTemplate();
+    Template = DescribedTemplate ? DescribedTemplate : Template;
+  }
+
   DeclContext *DC = Template->getDeclContext();
   if (DC->isDependentContext())
     return;
index 29adc8f560305f6838b6a5932e9c50796d787b51..c5deb9fe91950193092a0defc076786ef9eeef0e 100644 (file)
@@ -489,6 +489,21 @@ static_assert(__is_same(decltype(ta), TestSuppression<const char *>), "");
 }
 #pragma clang diagnostic pop
 
+namespace PR41549 {
+
+template <class H, class P> struct umm;
+
+template <class H = int, class P = int>
+struct umm {
+  umm(H h = 0, P p = 0);
+};
+
+template <class H, class P> struct umm;
+
+umm m(1);
+
+}
+
 #else
 
 // expected-no-diagnostics