forked from OSchip/llvm-project
[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
This commit is contained in:
parent
638933acab
commit
914c4c306d
|
@ -2555,9 +2555,9 @@ class CXXConstructorDecl final
|
|||
|
||||
ExplicitSpecifier getExplicitSpecifierInternal() const {
|
||||
if (CXXConstructorDeclBits.HasTrailingExplicitSpecifier)
|
||||
return *getCanonicalDecl()->getTrailingObjects<ExplicitSpecifier>();
|
||||
return *getTrailingObjects<ExplicitSpecifier>();
|
||||
return ExplicitSpecifier(
|
||||
nullptr, getCanonicalDecl()->CXXConstructorDeclBits.IsSimpleExplicit
|
||||
nullptr, CXXConstructorDeclBits.IsSimpleExplicit
|
||||
? ExplicitSpecKind::ResolvedTrue
|
||||
: ExplicitSpecKind::ResolvedFalse);
|
||||
}
|
||||
|
@ -2598,10 +2598,10 @@ public:
|
|||
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.
|
||||
|
|
|
@ -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 <size_t N>
|
||||
explicit(N > 7)// expected-note {{resolved to true}}
|
||||
Str(char const (&str)[N]);
|
||||
};
|
||||
|
||||
template <size_t N>
|
||||
Str::Str(char const(&str)[N]) { }
|
||||
// expected-note@-1 {{candidate constructor}}
|
||||
|
||||
Str a = "short";
|
||||
Str b = "not so short";// expected-error {{no viable conversion}}
|
||||
|
||||
}
|
Loading…
Reference in New Issue