diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch new file mode 100644 index 0000000..15136bf --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch @@ -0,0 +1,117 @@ +From 87e73453e8135e72f592c1d7c84da942e7a1e308 Mon Sep 17 00:00:00 2001 +From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Tue, 29 Mar 2011 14:24:59 +0000 +Subject: [PATCH 026/200] * decl2.c (cp_check_const_attributes): New. + (cplus_decl_attributes): Call cp_check_const_attributes. + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@171667 138bc75d-0d04-0410-961f-82ee72b054a4 + +index eb5d4f5..f62f913 100644 +--- a/gcc/cp/decl2.c ++++ b/gcc/cp/decl2.c +@@ -1264,6 +1264,25 @@ cp_reconstruct_complex_type (tree type, tree bottom) + return cp_build_qualified_type (outer, cp_type_quals (type)); + } + ++/* Replaces any constexpr expression that may be into the attributes ++ arguments with their reduced value. */ ++ ++static void ++cp_check_const_attributes (tree attributes) ++{ ++ tree attr; ++ for (attr = attributes; attr; attr = TREE_CHAIN (attr)) ++ { ++ tree arg; ++ for (arg = TREE_VALUE (attr); arg; arg = TREE_CHAIN (arg)) ++ { ++ tree expr = TREE_VALUE (arg); ++ if (EXPR_P (expr)) ++ TREE_VALUE (arg) = maybe_constant_value (expr); ++ } ++ } ++} ++ + /* Like decl_attributes, but handle C++ complexity. */ + + void +@@ -1284,6 +1303,8 @@ cplus_decl_attributes (tree *decl, tree attributes, int flags) + return; + } + ++ cp_check_const_attributes (attributes); ++ + if (TREE_CODE (*decl) == TEMPLATE_DECL) + decl = &DECL_TEMPLATE_RESULT (*decl); + +new file mode 100644 +index 0000000..ac85c07 +--- /dev/null ++++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C +@@ -0,0 +1,63 @@ ++// { dg-options -std=c++0x } ++ ++//A few constexpr's ++constexpr int foo() { return __alignof__(int); } ++ ++template<typename T> ++constexpr int fooT() { return __alignof__(T); } ++ ++template<int N> ++constexpr int fooN() { return N; } ++ ++//Now the attributes ++ ++//with normal variables, ++int a __attribute__((aligned(foo()))); ++int b __attribute__((aligned(fooT<int>()))); ++int c __attribute__((aligned(fooN<__alignof__(int)>()))); ++ ++//with variables inside a template, ++template <typename T> ++void fun() ++{ ++ T a __attribute__((aligned(foo()))); ++ T b __attribute__((aligned(fooT<T>()))); ++ T c __attribute__((aligned(fooN<__alignof__(T)>()))); ++ T d __attribute__((aligned(fooT<int>()))); ++ T e __attribute__((aligned(fooN<__alignof__(int)>()))); ++} ++ ++//instantiate it, ++void bar() ++{ ++ fun<int>(); ++} ++ ++//with classes ++struct __attribute__((aligned(foo()))) S0 ++{ ++ char dummy; ++}; ++S0 s0; ++ ++struct __attribute__((aligned(fooT<int>()))) S1 ++{ ++ char dummy; ++}; ++S1 s1; ++ ++//and class templates ++template <typename T> ++struct __attribute__((aligned(foo()))) S2 ++{ ++ char dummy; ++}; ++ ++S2<int> s2; ++ ++template <typename T> ++struct __attribute__((aligned(fooT<T>()))) S3 ++{ ++ char dummy; ++}; ++S3<int> s3; +-- +1.7.0.4 + |