Re: r298676 - Fix handling of initialization from parenthesized initializer list.

2017-03-27 Thread Daniel Jasper via cfe-commits
-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 Smith 
wrote:

> 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.

2017-03-27 Thread Richard Smith via cfe-commits
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.

2017-03-27 Thread Daniel Jasper via cfe-commits
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.

2017-03-23 Thread Richard Smith via cfe-commits
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: