This patch:

2008-07-25  Jan Hubicka  <j...@suse.cz>

        * typeck.c (inline_conversion): Remove.
        (cp_build_function_call): Do not use inline_conversion.
        * decl.c (duplicate_decls): Do not insist on inline being declared
        early.
        (start_cleanup_fn): Do not assume that INLINE flags prevent function
        from being output.  We now remove static functions always.
        (finish_function): Do return warning on all static functions.
        * call.c (build_over_call): Do not use inline_conversion.
        * cp-tree.h (possibly_inlined_p): Declare.
        (inline_conversion): Remove.
        * pt.c (instantiate_decl): Use possibly_inlined_p predicate.
        * decl2.c (cp_write_global_declarations): Likewise.
        (mark_used): Likewise.
        (possibly_inlined_p): New functions.

breaks all combinations of C++ and Java using CNI, resulting in

/usr/lib/gcc/x86_64-redhat-linux/4.4.0/../../../../include/c++/4.4.0/bits/ostream_insert.h:107:
 error: mixing C++ and Java catches in a single translation unit

This happens because we now instantiate template functions based on
possibly_inlined_p() rather than DECL_INLINE.  In turn this causes us
to generate catch blocks for C++ exceptions, and these can't be mixed
in the same translation unit as Java exceptions.

Here's a test case.  I have a patch for this that I'll send in a subsequent 
mail.

Andrew.

javac TryCNI.java
gcj -c TryCNI.class
g++ -c natTryCNI.cc -O2
gcj -o TryCNI --main=TryCNI TryCNI.o natTryCNI.o -o TryCNI -lstdc++

#include "TryCNI.h"
#include <gcj/cni.h>

#include <iostream>

void
TryCNI::plonk()
{
  jstring s = barf();
  int len = JvGetStringUTFLength (s);
  char buf[len+1];
  JvGetStringUTFRegion (s, 0, len, buf);
  buf[len] = 0;
  std::cout << buf << "\n";
}
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __TryCNI__
#define __TryCNI__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
    class TryCNI;
}

class TryCNI : public ::java::lang::Object
{

public:
  TryCNI();
public: // actually package-private
  static ::java::lang::String * barf();
  static void plonk();
public:
  static void main(JArray< ::java::lang::String * > *);
  static ::java::lang::Class class$;
};

#endif // __TryCNI__
public class TryCNI
{
  static String barf()
  {
    return "barf!";
  }

  static native void plonk();

  public static void main(String[] argv)
  {
    plonk();
  }
}

Reply via email to