From 914c4c306d1206670c3486987b55fedc11eccee4 Mon Sep 17 00:00:00 2001 From: Gauthier Harnisch Date: Sun, 22 Sep 2019 21:59:10 +0000 Subject: [PATCH] [clang] fixing conditional explicit for out-of-line definition PR42980 Summary: not every read in CXXConstructorDecl::getExplicitSpecifierInternal() was made on the canonical declaration. Reviewers: rsmith, aaron.ballman Reviewed By: rsmith Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D67889 llvm-svn: 372530 --- clang/include/clang/AST/DeclCXX.h | 8 ++++---- clang/test/SemaCXX/cxx2a-explicit-bool.cpp | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index 49a0e6e98262e..a5dc83735fde0 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/include/clang/AST/DeclCXX.h @@ -2555,9 +2555,9 @@ class CXXConstructorDecl final ExplicitSpecifier getExplicitSpecifierInternal() const { if (CXXConstructorDeclBits.HasTrailingExplicitSpecifier) - return *getCanonicalDecl()->getTrailingObjects(); + return *getTrailingObjects(); return ExplicitSpecifier( - nullptr, getCanonicalDecl()->CXXConstructorDeclBits.IsSimpleExplicit + nullptr, CXXConstructorDeclBits.IsSimpleExplicit ? ExplicitSpecKind::ResolvedTrue : ExplicitSpecKind::ResolvedFalse); } @@ -2598,10 +2598,10 @@ class CXXConstructorDecl final InheritedConstructor Inherited = InheritedConstructor()); ExplicitSpecifier getExplicitSpecifier() { - return getExplicitSpecifierInternal(); + return getCanonicalDecl()->getExplicitSpecifierInternal(); } const ExplicitSpecifier getExplicitSpecifier() const { - return getExplicitSpecifierInternal(); + return getCanonicalDecl()->getExplicitSpecifierInternal(); } /// Return true if the declartion is already resolved to be explicit. diff --git a/clang/test/SemaCXX/cxx2a-explicit-bool.cpp b/clang/test/SemaCXX/cxx2a-explicit-bool.cpp index 1c532cfb59766..56fa76f0a8bd5 100644 --- a/clang/test/SemaCXX/cxx2a-explicit-bool.cpp +++ b/clang/test/SemaCXX/cxx2a-explicit-bool.cpp @@ -717,3 +717,21 @@ A d2{0, 0}; A d3 = {0.0, 0.0};// expected-error {{explicit deduction guide}} } + +namespace PR42980 { +using size_t = decltype(sizeof(0)); + +struct Str {// expected-note+ {{candidate constructor}} + template + explicit(N > 7)// expected-note {{resolved to true}} + Str(char const (&str)[N]); +}; + +template +Str::Str(char const(&str)[N]) { } +// expected-note@-1 {{candidate constructor}} + +Str a = "short"; +Str b = "not so short";// expected-error {{no viable conversion}} + +} \ No newline at end of file