|
11 | 11 | //===----------------------------------------------------------------------===// |
12 | 12 |
|
13 | 13 | #include "clang/AST/DeclCXX.h" |
| 14 | +#include "clang/AST/TemplateBase.h" |
14 | 15 | #include "clang/AST/Type.h" |
15 | 16 | #include "clang/Basic/DiagnosticParse.h" |
16 | 17 | #include "clang/Basic/DiagnosticSema.h" |
@@ -1986,9 +1987,11 @@ static ExtractedTypeTraitInfo ExtractTypeTraitFromExpression(const Expr *E) { |
1986 | 1987 | if (Arg.getKind() == TemplateArgument::ArgKind::Pack) { |
1987 | 1988 | for (const auto &InnerArg : Arg.pack_elements()) |
1988 | 1989 | Args.push_back(InnerArg.getAsType()); |
1989 | | - } |
1990 | | - if (Arg.getKind() == TemplateArgument::ArgKind::Type) |
| 1990 | + } else if (Arg.getKind() == TemplateArgument::ArgKind::Type) |
1991 | 1991 | Args.push_back(Arg.getAsType()); |
| 1992 | + assert((Arg.getKind() == TemplateArgument::ArgKind::Type || |
| 1993 | + Arg.getKind() == TemplateArgument::ArgKind::Pack) && |
| 1994 | + "Unexpected kind"); |
1992 | 1995 | } |
1993 | 1996 | return {{Trait.value(), std::move(Args)}}; |
1994 | 1997 | } |
@@ -2263,12 +2266,19 @@ static void DiagnoseNonTriviallyCopyableReason(Sema &SemaRef, |
2263 | 2266 | static void DiagnoseNonConstructibleReason( |
2264 | 2267 | Sema &SemaRef, SourceLocation Loc, |
2265 | 2268 | const llvm::SmallVector<clang::QualType, 1> &Ts) { |
2266 | | - for (const auto &ArgTy : Ts) { |
2267 | | - if (ArgTy->isVoidType()) |
2268 | | - SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason) |
2269 | | - << diag::TraitNotSatisfiedReason::CVVoidType; |
| 2269 | + if (Ts.empty()) { |
| 2270 | + return; |
2270 | 2271 | } |
2271 | 2272 |
|
| 2273 | + bool ContainsVoid = false; |
| 2274 | + for (const QualType &ArgTy : Ts) { |
| 2275 | + ContainsVoid |= ArgTy->isVoidType(); |
| 2276 | + } |
| 2277 | + |
| 2278 | + if (ContainsVoid) |
| 2279 | + SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason) |
| 2280 | + << diag::TraitNotSatisfiedReason::CVVoidType; |
| 2281 | + |
2272 | 2282 | QualType T = Ts[0]; |
2273 | 2283 | if (T->isFunctionType()) |
2274 | 2284 | SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason) |
|
0 commit comments