decl2.c (cp_check_const_attributes): New.

* decl2.c (cp_check_const_attributes): New.
	(cplus_decl_attributes): Call cp_check_const_attributes.

From-SVN: r171010
This commit is contained in:
Rodrigo Rivas Costa 2011-03-15 18:27:19 +00:00 committed by Jason Merrill
parent 4c66d85a55
commit 437697b8ee
4 changed files with 93 additions and 0 deletions

View file

@ -1,3 +1,8 @@
2011-03-15 Rodrigo Rivas Costa <rodrigorivascosta@gmail.com>
* decl2.c (cp_check_const_attributes): New.
(cplus_decl_attributes): Call cp_check_const_attributes.
2011-03-15 Jason Merrill <jason@redhat.com>
PR c++/34758

View file

@ -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);

View file

@ -1,3 +1,7 @@
2011-03-15 Rodrigo Rivas Costa <rodrigorivascosta@gmail.com>
* g++.dg/cpp0x/constexpr-attribute.C: New.
2011-03-15 Manuel López-Ibáñez <manu@gcc.gnu.org>
* g++.dg/parse/pr34758.C: New.

View file

@ -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;