[clang] 6d894af - PR45124: Don't leave behind pending cleanups when declaring implicit
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 6 13:24:18 PST 2020
Author: Richard Smith
Date: 2020-03-06T13:22:10-08:00
New Revision: 6d894afdea433879f54e5ba07e827db006645b7b
URL: https://github.com/llvm/llvm-project/commit/6d894afdea433879f54e5ba07e827db006645b7b
DIFF: https://github.com/llvm/llvm-project/commit/6d894afdea433879f54e5ba07e827db006645b7b.diff
LOG: PR45124: Don't leave behind pending cleanups when declaring implicit
deduction guides.
Previously if an implicit deduction guide had a default argument with a
cleanup, we'd leave the 'pending cleanup' flag set after declaring the
implicit guide. But it turns out that there's no reason to even
substitute into the default argument when declaring an implicit
deduction guide: we only need to record that the default argument
exists, not what it is, since we never actually form a call to a
deduction guide.
Added:
Modified:
clang/lib/Sema/SemaTemplate.cpp
clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index c1084b875a92..3fb39853d9b4 100755
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -2173,9 +2173,15 @@ struct ConvertConstructorToDeductionGuideTransform {
// constructor.
ExprResult NewDefArg;
if (OldParam->hasDefaultArg()) {
- NewDefArg = SemaRef.SubstExpr(OldParam->getDefaultArg(), Args);
- if (NewDefArg.isInvalid())
- return nullptr;
+ // We don't care what the value is (we won't use it); just create a
+ // placeholder to indicate there is a default argument.
+ QualType ParamTy = NewDI->getType();
+ NewDefArg = new (SemaRef.Context)
+ OpaqueValueExpr(OldParam->getDefaultArg()->getBeginLoc(),
+ ParamTy.getNonLValueExprType(SemaRef.Context),
+ ParamTy->isLValueReferenceType() ? VK_LValue :
+ ParamTy->isRValueReferenceType() ? VK_XValue :
+ VK_RValue);
}
ParmVarDecl *NewParam = ParmVarDecl::Create(SemaRef.Context, DC,
diff --git a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp
index 85312cf1049f..2a3f312ebd8e 100644
--- a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp
+++ b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp
@@ -507,6 +507,21 @@ umm m(1);
}
+namespace PR45124 {
+ class a { int d; };
+ class b : a {};
+
+ struct x { ~x(); };
+ template<typename> class y { y(x = x()); };
+ template<typename z> y(z)->y<z>;
+
+ // Not a constant initializer, but trivial default initialization. We won't
+ // detect this as trivial default initialization if synthesizing the implicit
+ // deduction guide 'template<typename T> y(x = x()) -> Y<T>;' leaves behind a
+ // pending cleanup.
+ __thread b g;
+}
+
#else
// expected-no-diagnostics
More information about the cfe-commits
mailing list