diff options
author | Jason Merrill <jason@redhat.com> | 2011-08-23 12:03:01 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-08-23 12:03:01 -0400 |
commit | 2787914706395bf7864bdc76491ada1b0a552cae (patch) | |
tree | cea100638ebf6cc422229ffd053565b0691337bb /gcc | |
parent | 7a74aa7f4a5666e5b50c30d57b00845337d51906 (diff) | |
download | gcc-2787914706395bf7864bdc76491ada1b0a552cae.zip gcc-2787914706395bf7864bdc76491ada1b0a552cae.tar.gz gcc-2787914706395bf7864bdc76491ada1b0a552cae.tar.bz2 |
re PR c++/50024 ([C++0x] [4.7 Regression] crash when using braced initialization in member function of template)
PR c++/50024
* semantics.c (maybe_constant_value): Don't try to fold { }.
* pt.c (build_non_dependent_expr): Don't wrap { }.
* init.c (build_value_init): Allow scalar value-init in templates.
From-SVN: r177994
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/init.c | 2 | ||||
-rw-r--r-- | gcc/cp/pt.c | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C | 15 |
6 files changed, 33 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 524a685..0f60bcb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2011-08-23 Jason Merrill <jason@redhat.com> + PR c++/50024 + * semantics.c (maybe_constant_value): Don't try to fold { }. + * pt.c (build_non_dependent_expr): Don't wrap { }. + * init.c (build_value_init): Allow scalar value-init in templates. + +2011-08-23 Jason Merrill <jason@redhat.com> + * semantics.c (potential_constant_expression_1): Allow 'this'. 2011-08-23 Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 4fa627b..847f519 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -330,7 +330,7 @@ build_value_init (tree type, tsubst_flags_t complain) constructor. */ /* The AGGR_INIT_EXPR tweaking below breaks in templates. */ - gcc_assert (!processing_template_decl); + gcc_assert (!processing_template_decl || SCALAR_TYPE_P (type)); if (CLASS_TYPE_P (type)) { diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ed4fe72..3f9a4c0 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -19669,6 +19669,10 @@ build_non_dependent_expr (tree expr) if (TREE_CODE (expr) == THROW_EXPR) return expr; + /* Don't wrap an initializer list, we need to be able to look inside. */ + if (BRACE_ENCLOSED_INITIALIZER_P (expr)) + return expr; + if (TREE_CODE (expr) == COND_EXPR) return build3 (COND_EXPR, TREE_TYPE (expr), diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 1f6b49a..2f62e35 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7542,6 +7542,7 @@ maybe_constant_value (tree t) if (type_dependent_expression_p (t) || type_unknown_p (t) + || BRACE_ENCLOSED_INITIALIZER_P (t) || !potential_constant_expression (t) || value_dependent_expression_p (t)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e3c521c..fe36888 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-08-23 Jason Merrill <jason@redhat.com> + + PR c++/50024 + * g++.dg/cpp0x/constexpr-initlist5.C: New. + 2011-08-23 Jakub Jelinek <jakub@redhat.com> PR c++/50158 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C new file mode 100644 index 0000000..97f0399 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C @@ -0,0 +1,15 @@ +// PR c++/50024 +// { dg-options -std=c++0x } + +template< class T > +struct Container +{ + Container(){ + int* ptr = new int{}; + } +}; + +int main() { + Container< int > c; +} + |