re PR c++/36364 (Problem with -frepo)

PR c++/36364
	* repo.c (repo_emit_p): Put const static data members initialized
	by const expr into *.rpo file, just return 2 if IDENTIFIER_REPO_CHOSEN
	for it is 0.

	* g++.dg/template/repo9.C: New test.

From-SVN: r137205
This commit is contained in:
Jakub Jelinek 2008-06-28 00:26:48 +02:00 committed by Jakub Jelinek
parent e3fd526b6a
commit 0ac69b47fb
4 changed files with 66 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2008-06-28 Jakub Jelinek <jakub@redhat.com>
PR c++/36364
* repo.c (repo_emit_p): Put const static data members initialized
by const expr into *.rpo file, just return 2 if IDENTIFIER_REPO_CHOSEN
for it is 0.
2008-06-27 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/36655

View File

@ -280,6 +280,7 @@ finish_repo (void)
int
repo_emit_p (tree decl)
{
int ret = 0;
gcc_assert (TREE_PUBLIC (decl));
gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
|| TREE_CODE (decl) == VAR_DECL);
@ -306,10 +307,12 @@ repo_emit_p (tree decl)
return 2;
/* Const static data members initialized by constant expressions must
be processed where needed so that their definitions are
available. */
available. Still record them into *.rpo files, so if they
weren't actually emitted and collect2 requests them, they can
be provided. */
if (DECL_INTEGRAL_CONSTANT_VAR_P (decl)
&& DECL_CLASS_SCOPE_P (decl))
return 2;
ret = 2;
}
else if (!DECL_TEMPLATE_INSTANTIATION (decl))
return 2;
@ -343,7 +346,7 @@ repo_emit_p (tree decl)
pending_repo = tree_cons (NULL_TREE, decl, pending_repo);
}
return IDENTIFIER_REPO_CHOSEN (DECL_ASSEMBLER_NAME (decl));
return IDENTIFIER_REPO_CHOSEN (DECL_ASSEMBLER_NAME (decl)) ? 1 : ret;
}
/* Returns true iff the prelinker has explicitly marked CLASS_TYPE for

View File

@ -1,3 +1,8 @@
2008-06-28 Jakub Jelinek <jakub@redhat.com>
PR c++/36364
* g++.dg/template/repo9.C: New test.
2008-06-27 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/36655

View File

@ -0,0 +1,48 @@
// PR c++/36364
// { dg-options "-frepo" }
// { dg-final { cleanup-repo-files } }
// { dg-require-host-local "" }
template <typename C> struct A
{
static void assign (C &c1, const C &c2) { c1 = c2; }
};
template <typename C, typename T> struct B
{
struct D
{
static const C terminal;
static unsigned long stor[];
static D &empty_rep ()
{
void *p = reinterpret_cast <void *>(&stor);
return *reinterpret_cast <D *>(p);
}
void test (unsigned long n)
{
T::assign (this->refdata ()[n], terminal);
}
C *refdata () throw ()
{
return reinterpret_cast <C *>(this + 1);
}
};
C *dataplus;
C *data () const { return dataplus; }
D *rep () const { return &((reinterpret_cast < D * >(data ()))[-1]); }
static D & empty_rep () { return D::empty_rep (); }
B () : dataplus (empty_rep ().refdata ()) { }
~B () { }
void push_back (C c) { rep ()->test (10); }
};
template <typename C, typename T> const C B <C, T>::D::terminal = C ();
template <typename C, typename T> unsigned long B <C, T>::D::stor[64];
int
main ()
{
B <char, A <char> > s;
s.push_back ('a');
}