Re: r298676 - Fix handling of initialization from parenthesized initializer list.
-Wunused-value is always triggered if a constructor of an object with a non-trivial destructor has an initializer list as first parameter. So in the test, even "Used({});" triggers -Wunused-value. That seems inconsistent (replacing the init list with something else silences the warning) and also there is a code pattern where this is used to construct and immediately destruct an object. On Mon, Mar 27, 2017 at 3:49 PM, Richard Smithwrote: > What is the effect on that testcase? (Sorry, heading to vacation and can't > easily check.) > > On 27 Mar 2017 6:33 am, "Daniel Jasper" wrote: > >> Hi Richard, >> >> this seems to have an unwanted side-effect on -Wunused-value (test case >> attached). Could you take a look? >> >> Cheers, >> Daniel >> >> On Fri, Mar 24, 2017 at 2:14 AM, Richard Smith via cfe-commits < >> cfe-commits@lists.llvm.org> wrote: >> >>> Author: rsmith >>> Date: Thu Mar 23 20:14:25 2017 >>> New Revision: 298676 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=298676=rev >>> Log: >>> Fix handling of initialization from parenthesized initializer list. >>> >>> This change fixes a crash on initialization of a reference from ({}) >>> during >>> template instantiation and incidentally improves diagnostics. >>> >>> This reverts a prior attempt to handle this in r286721. Instead, we >>> teach the >>> initialization code that initialization cannot be performed if a source >>> type >>> is required and the initializer is an initializer list (which is not an >>> expression and does not have a type), and likewise for function-style >>> cast >>> expressions. >>> >>> Modified: >>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >>> cfe/trunk/include/clang/Sema/Initialization.h >>> cfe/trunk/include/clang/Sema/Sema.h >>> cfe/trunk/lib/Sema/SemaDecl.cpp >>> cfe/trunk/lib/Sema/SemaExprCXX.cpp >>> cfe/trunk/lib/Sema/SemaInit.cpp >>> cfe/trunk/test/SemaCXX/cxx0x-initializer-constructor.cpp >>> cfe/trunk/test/SemaCXX/cxx0x-initializer-references.cpp >>> cfe/trunk/test/SemaCXX/cxx0x-initializer-scalars.cpp >>> cfe/trunk/test/SemaCXX/type-convert-construct.cpp >>> >>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ >>> Basic/DiagnosticSemaKinds.td?rev=298676=298675=298676=diff >>> >>> == >>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) >>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Mar 23 >>> 20:14:25 2017 >>> @@ -1814,8 +1814,9 @@ def note_uninit_fixit_remove_cond : Note >>>"remove the %select{'%1' if its condition|condition if it}0 " >>>"is always %select{false|true}2">; >>> def err_init_incomplete_type : Error<"initialization of incomplete type >>> %0">; >>> -def err_list_init_in_parens : Error<"list-initializer for non-class >>> type %0 " >>> - "must not be parenthesized">; >>> +def err_list_init_in_parens : Error< >>> + "cannot initialize %select{non-class|reference}0 type %1 with a " >>> + "parenthesized initializer list">; >>> >>> def warn_unsequenced_mod_mod : Warning< >>>"multiple unsequenced modifications to %0">, InGroup; >>> @@ -5865,8 +5866,8 @@ def err_builtin_func_cast_more_than_one_ >>>"function-style cast to a builtin type can only take one argument">; >>> def err_value_init_for_array_type : Error< >>>"array types cannot be value-initialized">; >>> -def err_value_init_for_function_type : Error< >>> - "function types cannot be value-initialized">; >>> +def err_init_for_function_type : Error< >>> + "cannot create object of function type %0">; >>> def warn_format_nonliteral_noargs : Warning< >>>"format string is not a string literal (potentially insecure)">, >>>InGroup; >>> >>> Modified: cfe/trunk/include/clang/Sema/Initialization.h >>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ >>> Sema/Initialization.h?rev=298676=298675=298676=diff >>> >>> == >>> --- cfe/trunk/include/clang/Sema/Initialization.h (original) >>> +++ cfe/trunk/include/clang/Sema/Initialization.h Thu Mar 23 20:14:25 >>> 2017 >>> @@ -822,6 +822,8 @@ public: >>>enum FailureKind { >>> /// \brief Too many initializers provided for a reference. >>> FK_TooManyInitsForReference, >>> +/// \brief Reference initialized from a parenthesized initializer >>> list. >>> +FK_ParenthesizedListInitForReference, >>> /// \brief Array must be initialized with an initializer list. >>> FK_ArrayNeedsInitList, >>> /// \brief Array must be initialized with an initializer list or a >>> @@ -866,6 +868,8 @@ public: >>> FK_ConversionFromPropertyFailed, >>> /// \brief Too many initializers for scalar >>> FK_TooManyInitsForScalar, >>> +/// \brief Scalar initialized from a parenthesized
Re: r298676 - Fix handling of initialization from parenthesized initializer list.
What is the effect on that testcase? (Sorry, heading to vacation and can't easily check.) On 27 Mar 2017 6:33 am, "Daniel Jasper"wrote: > Hi Richard, > > this seems to have an unwanted side-effect on -Wunused-value (test case > attached). Could you take a look? > > Cheers, > Daniel > > On Fri, Mar 24, 2017 at 2:14 AM, Richard Smith via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> Author: rsmith >> Date: Thu Mar 23 20:14:25 2017 >> New Revision: 298676 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=298676=rev >> Log: >> Fix handling of initialization from parenthesized initializer list. >> >> This change fixes a crash on initialization of a reference from ({}) >> during >> template instantiation and incidentally improves diagnostics. >> >> This reverts a prior attempt to handle this in r286721. Instead, we teach >> the >> initialization code that initialization cannot be performed if a source >> type >> is required and the initializer is an initializer list (which is not an >> expression and does not have a type), and likewise for function-style cast >> expressions. >> >> Modified: >> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >> cfe/trunk/include/clang/Sema/Initialization.h >> cfe/trunk/include/clang/Sema/Sema.h >> cfe/trunk/lib/Sema/SemaDecl.cpp >> cfe/trunk/lib/Sema/SemaExprCXX.cpp >> cfe/trunk/lib/Sema/SemaInit.cpp >> cfe/trunk/test/SemaCXX/cxx0x-initializer-constructor.cpp >> cfe/trunk/test/SemaCXX/cxx0x-initializer-references.cpp >> cfe/trunk/test/SemaCXX/cxx0x-initializer-scalars.cpp >> cfe/trunk/test/SemaCXX/type-convert-construct.cpp >> >> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ >> Basic/DiagnosticSemaKinds.td?rev=298676=298675=298676=diff >> >> == >> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) >> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Mar 23 >> 20:14:25 2017 >> @@ -1814,8 +1814,9 @@ def note_uninit_fixit_remove_cond : Note >>"remove the %select{'%1' if its condition|condition if it}0 " >>"is always %select{false|true}2">; >> def err_init_incomplete_type : Error<"initialization of incomplete type >> %0">; >> -def err_list_init_in_parens : Error<"list-initializer for non-class type >> %0 " >> - "must not be parenthesized">; >> +def err_list_init_in_parens : Error< >> + "cannot initialize %select{non-class|reference}0 type %1 with a " >> + "parenthesized initializer list">; >> >> def warn_unsequenced_mod_mod : Warning< >>"multiple unsequenced modifications to %0">, InGroup; >> @@ -5865,8 +5866,8 @@ def err_builtin_func_cast_more_than_one_ >>"function-style cast to a builtin type can only take one argument">; >> def err_value_init_for_array_type : Error< >>"array types cannot be value-initialized">; >> -def err_value_init_for_function_type : Error< >> - "function types cannot be value-initialized">; >> +def err_init_for_function_type : Error< >> + "cannot create object of function type %0">; >> def warn_format_nonliteral_noargs : Warning< >>"format string is not a string literal (potentially insecure)">, >>InGroup; >> >> Modified: cfe/trunk/include/clang/Sema/Initialization.h >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ >> Sema/Initialization.h?rev=298676=298675=298676=diff >> >> == >> --- cfe/trunk/include/clang/Sema/Initialization.h (original) >> +++ cfe/trunk/include/clang/Sema/Initialization.h Thu Mar 23 20:14:25 >> 2017 >> @@ -822,6 +822,8 @@ public: >>enum FailureKind { >> /// \brief Too many initializers provided for a reference. >> FK_TooManyInitsForReference, >> +/// \brief Reference initialized from a parenthesized initializer >> list. >> +FK_ParenthesizedListInitForReference, >> /// \brief Array must be initialized with an initializer list. >> FK_ArrayNeedsInitList, >> /// \brief Array must be initialized with an initializer list or a >> @@ -866,6 +868,8 @@ public: >> FK_ConversionFromPropertyFailed, >> /// \brief Too many initializers for scalar >> FK_TooManyInitsForScalar, >> +/// \brief Scalar initialized from a parenthesized initializer list. >> +FK_ParenthesizedListInitForScalar, >> /// \brief Reference initialization from an initializer list >> FK_ReferenceBindingToInitList, >> /// \brief Initialization of some unused destination type with an >> @@ -892,7 +896,7 @@ public: >> /// having its address taken. >> FK_AddressOfUnaddressableFunction, >> /// \brief List-copy-initialization chose an explicit constructor. >> -FK_ExplicitConstructor >> +FK_ExplicitConstructor, >>}; >> >> private: >> >> Modified: cfe/trunk/include/clang/Sema/Sema.h >> URL:
Re: r298676 - Fix handling of initialization from parenthesized initializer list.
Hi Richard, this seems to have an unwanted side-effect on -Wunused-value (test case attached). Could you take a look? Cheers, Daniel On Fri, Mar 24, 2017 at 2:14 AM, Richard Smith via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: rsmith > Date: Thu Mar 23 20:14:25 2017 > New Revision: 298676 > > URL: http://llvm.org/viewvc/llvm-project?rev=298676=rev > Log: > Fix handling of initialization from parenthesized initializer list. > > This change fixes a crash on initialization of a reference from ({}) during > template instantiation and incidentally improves diagnostics. > > This reverts a prior attempt to handle this in r286721. Instead, we teach > the > initialization code that initialization cannot be performed if a source > type > is required and the initializer is an initializer list (which is not an > expression and does not have a type), and likewise for function-style cast > expressions. > > Modified: > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/include/clang/Sema/Initialization.h > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/lib/Sema/SemaDecl.cpp > cfe/trunk/lib/Sema/SemaExprCXX.cpp > cfe/trunk/lib/Sema/SemaInit.cpp > cfe/trunk/test/SemaCXX/cxx0x-initializer-constructor.cpp > cfe/trunk/test/SemaCXX/cxx0x-initializer-references.cpp > cfe/trunk/test/SemaCXX/cxx0x-initializer-scalars.cpp > cfe/trunk/test/SemaCXX/type-convert-construct.cpp > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/ > DiagnosticSemaKinds.td?rev=298676=298675=298676=diff > > == > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Mar 23 > 20:14:25 2017 > @@ -1814,8 +1814,9 @@ def note_uninit_fixit_remove_cond : Note >"remove the %select{'%1' if its condition|condition if it}0 " >"is always %select{false|true}2">; > def err_init_incomplete_type : Error<"initialization of incomplete type > %0">; > -def err_list_init_in_parens : Error<"list-initializer for non-class type > %0 " > - "must not be parenthesized">; > +def err_list_init_in_parens : Error< > + "cannot initialize %select{non-class|reference}0 type %1 with a " > + "parenthesized initializer list">; > > def warn_unsequenced_mod_mod : Warning< >"multiple unsequenced modifications to %0">, InGroup; > @@ -5865,8 +5866,8 @@ def err_builtin_func_cast_more_than_one_ >"function-style cast to a builtin type can only take one argument">; > def err_value_init_for_array_type : Error< >"array types cannot be value-initialized">; > -def err_value_init_for_function_type : Error< > - "function types cannot be value-initialized">; > +def err_init_for_function_type : Error< > + "cannot create object of function type %0">; > def warn_format_nonliteral_noargs : Warning< >"format string is not a string literal (potentially insecure)">, >InGroup; > > Modified: cfe/trunk/include/clang/Sema/Initialization.h > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Sema/Initialization.h?rev=298676=298675=298676=diff > > == > --- cfe/trunk/include/clang/Sema/Initialization.h (original) > +++ cfe/trunk/include/clang/Sema/Initialization.h Thu Mar 23 20:14:25 2017 > @@ -822,6 +822,8 @@ public: >enum FailureKind { > /// \brief Too many initializers provided for a reference. > FK_TooManyInitsForReference, > +/// \brief Reference initialized from a parenthesized initializer > list. > +FK_ParenthesizedListInitForReference, > /// \brief Array must be initialized with an initializer list. > FK_ArrayNeedsInitList, > /// \brief Array must be initialized with an initializer list or a > @@ -866,6 +868,8 @@ public: > FK_ConversionFromPropertyFailed, > /// \brief Too many initializers for scalar > FK_TooManyInitsForScalar, > +/// \brief Scalar initialized from a parenthesized initializer list. > +FK_ParenthesizedListInitForScalar, > /// \brief Reference initialization from an initializer list > FK_ReferenceBindingToInitList, > /// \brief Initialization of some unused destination type with an > @@ -892,7 +896,7 @@ public: > /// having its address taken. > FK_AddressOfUnaddressableFunction, > /// \brief List-copy-initialization chose an explicit constructor. > -FK_ExplicitConstructor > +FK_ExplicitConstructor, >}; > > private: > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Sema/Sema.h?rev=298676=298675=298676=diff > > == > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Thu Mar
r298676 - Fix handling of initialization from parenthesized initializer list.
Author: rsmith Date: Thu Mar 23 20:14:25 2017 New Revision: 298676 URL: http://llvm.org/viewvc/llvm-project?rev=298676=rev Log: Fix handling of initialization from parenthesized initializer list. This change fixes a crash on initialization of a reference from ({}) during template instantiation and incidentally improves diagnostics. This reverts a prior attempt to handle this in r286721. Instead, we teach the initialization code that initialization cannot be performed if a source type is required and the initializer is an initializer list (which is not an expression and does not have a type), and likewise for function-style cast expressions. Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/include/clang/Sema/Initialization.h cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/lib/Sema/SemaExprCXX.cpp cfe/trunk/lib/Sema/SemaInit.cpp cfe/trunk/test/SemaCXX/cxx0x-initializer-constructor.cpp cfe/trunk/test/SemaCXX/cxx0x-initializer-references.cpp cfe/trunk/test/SemaCXX/cxx0x-initializer-scalars.cpp cfe/trunk/test/SemaCXX/type-convert-construct.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=298676=298675=298676=diff == --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Mar 23 20:14:25 2017 @@ -1814,8 +1814,9 @@ def note_uninit_fixit_remove_cond : Note "remove the %select{'%1' if its condition|condition if it}0 " "is always %select{false|true}2">; def err_init_incomplete_type : Error<"initialization of incomplete type %0">; -def err_list_init_in_parens : Error<"list-initializer for non-class type %0 " - "must not be parenthesized">; +def err_list_init_in_parens : Error< + "cannot initialize %select{non-class|reference}0 type %1 with a " + "parenthesized initializer list">; def warn_unsequenced_mod_mod : Warning< "multiple unsequenced modifications to %0">, InGroup; @@ -5865,8 +5866,8 @@ def err_builtin_func_cast_more_than_one_ "function-style cast to a builtin type can only take one argument">; def err_value_init_for_array_type : Error< "array types cannot be value-initialized">; -def err_value_init_for_function_type : Error< - "function types cannot be value-initialized">; +def err_init_for_function_type : Error< + "cannot create object of function type %0">; def warn_format_nonliteral_noargs : Warning< "format string is not a string literal (potentially insecure)">, InGroup; Modified: cfe/trunk/include/clang/Sema/Initialization.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Initialization.h?rev=298676=298675=298676=diff == --- cfe/trunk/include/clang/Sema/Initialization.h (original) +++ cfe/trunk/include/clang/Sema/Initialization.h Thu Mar 23 20:14:25 2017 @@ -822,6 +822,8 @@ public: enum FailureKind { /// \brief Too many initializers provided for a reference. FK_TooManyInitsForReference, +/// \brief Reference initialized from a parenthesized initializer list. +FK_ParenthesizedListInitForReference, /// \brief Array must be initialized with an initializer list. FK_ArrayNeedsInitList, /// \brief Array must be initialized with an initializer list or a @@ -866,6 +868,8 @@ public: FK_ConversionFromPropertyFailed, /// \brief Too many initializers for scalar FK_TooManyInitsForScalar, +/// \brief Scalar initialized from a parenthesized initializer list. +FK_ParenthesizedListInitForScalar, /// \brief Reference initialization from an initializer list FK_ReferenceBindingToInitList, /// \brief Initialization of some unused destination type with an @@ -892,7 +896,7 @@ public: /// having its address taken. FK_AddressOfUnaddressableFunction, /// \brief List-copy-initialization chose an explicit constructor. -FK_ExplicitConstructor +FK_ExplicitConstructor, }; private: Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=298676=298675=298676=diff == --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Thu Mar 23 20:14:25 2017 @@ -1822,7 +1822,6 @@ public: void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit); void ActOnUninitializedDecl(Decl *dcl); void ActOnInitializerError(Decl *Dcl); - bool canInitializeWithParenthesizedList(QualType TargetType); void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc); void ActOnCXXForRangeDecl(Decl *D); Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: