Author: rsmith Date: Fri Dec 9 16:56:20 2016 New Revision: 289286 URL: http://llvm.org/viewvc/llvm-project?rev=289286&view=rev Log: [c++17] P0490R0, NB comment FI 20: allow direct-initialization of decomposition declarations.
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/Parser/cxx1z-decomposition.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=289286&r1=289285&r2=289286&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Dec 9 16:56:20 2016 @@ -398,8 +398,6 @@ def err_decomp_decl_not_alone : Error< "decomposition declaration must be the only declaration in its group">; def err_decomp_decl_requires_init : Error< "decomposition declaration %0 requires an initializer">; -def err_decomp_decl_paren_init : Error< - "decomposition declaration %0 cannot have a parenthesized initializer">; def err_decomp_decl_wrong_number_bindings : Error< "type %0 decomposes into %2 elements, but %select{only |}3%1 " "names were provided">; Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=289286&r1=289285&r2=289286&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Dec 9 16:56:20 2016 @@ -9625,6 +9625,20 @@ namespace { } } // end anonymous namespace +namespace { + // Simple wrapper to add the name of a variable or (if no variable is + // available) a DeclarationName into a diagnostic. + struct VarDeclOrName { + VarDecl *VDecl; + DeclarationName Name; + + friend const Sema::SemaDiagnosticBuilder & + operator<<(const Sema::SemaDiagnosticBuilder &Diag, VarDeclOrName VN) { + return VN.VDecl ? Diag << VN.VDecl : Diag << VN.Name; + } + }; +} // end anonymous namespace + QualType Sema::deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, @@ -9634,6 +9648,8 @@ QualType Sema::deduceVarTypeFromInitiali assert((!VDecl || !VDecl->isInitCapture()) && "init captures are expected to be deduced prior to initialization"); + VarDeclOrName VN{VDecl, Name}; + // FIXME: Deduction for a decomposition declaration does weird things if the // initializer is an array. @@ -9652,7 +9668,7 @@ QualType Sema::deduceVarTypeFromInitiali Diag(Init->getLocStart(), IsInitCapture ? diag::err_init_capture_no_expression : diag::err_auto_var_init_no_expression) - << Name << Type << Range; + << VN << Type << Range; return QualType(); } @@ -9660,7 +9676,7 @@ QualType Sema::deduceVarTypeFromInitiali Diag(DeduceInits[1]->getLocStart(), IsInitCapture ? diag::err_init_capture_multiple_expressions : diag::err_auto_var_init_multiple_expressions) - << Name << Type << Range; + << VN << Type << Range; return QualType(); } @@ -9669,7 +9685,7 @@ QualType Sema::deduceVarTypeFromInitiali Diag(Init->getLocStart(), IsInitCapture ? diag::err_init_capture_paren_braces : diag::err_auto_var_init_paren_braces) - << isa<InitListExpr>(Init) << Name << Type << Range; + << isa<InitListExpr>(Init) << VN << Type << Range; return QualType(); } @@ -9692,13 +9708,13 @@ QualType Sema::deduceVarTypeFromInitiali else if (isa<InitListExpr>(Init)) Diag(Range.getBegin(), diag::err_init_capture_deduction_failure_from_init_list) - << Name + << VN << (DeduceInit->getType().isNull() ? TSI->getType() : DeduceInit->getType()) << DeduceInit->getSourceRange(); else Diag(Range.getBegin(), diag::err_init_capture_deduction_failure) - << Name << TSI->getType() + << VN << TSI->getType() << (DeduceInit->getType().isNull() ? TSI->getType() : DeduceInit->getType()) << DeduceInit->getSourceRange(); @@ -9712,7 +9728,7 @@ QualType Sema::deduceVarTypeFromInitiali if (ActiveTemplateInstantiations.empty() && !DefaultedAnyToId && !IsInitCapture && !DeducedType.isNull() && DeducedType->isObjCIdType()) { SourceLocation Loc = TSI->getTypeLoc().getBeginLoc(); - Diag(Loc, diag::warn_auto_var_is_id) << Name << Range; + Diag(Loc, diag::warn_auto_var_is_id) << VN << Range; } return DeducedType; @@ -9746,11 +9762,6 @@ void Sema::AddInitializerToDecl(Decl *Re return; } - // C++1z [dcl.dcl]p1 grammar implies that a parenthesized initializer is not - // permitted. - if (isa<DecompositionDecl>(VDecl) && DirectInit && isa<ParenListExpr>(Init)) - Diag(VDecl->getLocation(), diag::err_decomp_decl_paren_init) << VDecl; - // C++11 [decl.spec.auto]p6. Deduce the type which 'auto' stands in for. if (TypeMayContainAuto && VDecl->getType()->isUndeducedType()) { // Attempt typo correction early so that the type of the init expression can Modified: cfe/trunk/test/Parser/cxx1z-decomposition.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx1z-decomposition.cpp?rev=289286&r1=289285&r2=289286&view=diff ============================================================================== --- cfe/trunk/test/Parser/cxx1z-decomposition.cpp (original) +++ cfe/trunk/test/Parser/cxx1z-decomposition.cpp Fri Dec 9 16:56:20 2016 @@ -139,9 +139,11 @@ namespace Init { int arr[1]; struct S { int n; }; auto &[bad1]; // expected-error {{decomposition declaration '[bad1]' requires an initializer}} - const auto &[bad2](S{}); // expected-error {{decomposition declaration '[bad2]' cannot have a parenthesized initializer}} + const auto &[bad2](S{}, S{}); // expected-error {{initializer for variable '[bad2]' with type 'const auto &' contains multiple expressions}} + const auto &[bad3](); // expected-error {{expected expression}} auto &[good1] = arr; auto &&[good2] = S{}; + const auto &[good3](S{}); S [goodish3] = { 4 }; // expected-error {{cannot be declared with type 'S'}} S [goodish4] { 4 }; // expected-error {{cannot be declared with type 'S'}} } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits