The default bug view has changed. See this FAQ.

Generating dombindings_gen.cpp multiple times results in a different file

RESOLVED FIXED in mozilla10

Status

()

Core
DOM
RESOLVED FIXED
6 years ago
6 years ago

People

(Reporter: Octoploid, Assigned: peterv)

Tracking

Trunk
mozilla10
Points:
---

Firefox Tracking Flags

(Not tracked)

Details

Attachments

(1 attachment)

(Reporter)

Description

6 years ago
User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0a1) Gecko/20100101 Firefox/10.0a1
Build ID: 20111007134757

Steps to reproduce:

Latest Firefox fails to build on x86_64-pc-linux-gnu with profiledbuild:




Actual results:

c++ -o dombindings.o -c -I../../../../dist/stl_wrappers -I../../../../dist/system_wrappers -include /var/tmp/mozilla-central/config/gcc_hidden.h -DMOZILLA_INTERNAL_API -D_IMPL_NS_COM -DEXPORT_XPT_API -DEXPORT_XPTC_API -D_IMPL_NS_GFX -D_IMPL_NS_WIDGET -DIMPL_XREAPI -DIMPL_NS_NET -DIMPL_THEBES  -DSTATIC_EXPORTABLE_JS_API -DOSTYPE=\"Linux3.1\" -DOSARCH=Linux -DJSFILE -DJS_THREADSAFE -DEXPORT_XPC_API  -DJS_TRACER=1 -DFEATURE_NANOJIT=1 -DAVMPLUS_64BIT -DAVMPLUS_AMD64 -DAVMPLUS_LINUX -DAVMPLUS_UNIX  -D_IMPL_NS_LAYOUT -I/var/tmp/mozilla-central/js/src/xpconnect/src/../wrappers -I/var/tmp/mozilla-central/js/src/xpconnect/src/../loader -I/var/tmp/mozilla-central/js/src -I/var/tmp/mozilla-central/js/src/nanojit -I/var/tmp/mozilla-central/caps/include -I/var/tmp/mozilla-central/content/base/src -I/var/tmp/mozilla-central/content/html/content/src -I/var/tmp/mozilla-central/content/html/document/src -I/var/tmp/mozilla-central/content/svg/content/src -I/var/tmp/mozilla-central/layout/style -I/var/tmp/mozilla-central/layout/base -I/var/tmp/mozilla-central/dom/base -I/var/tmp/mozilla-central/xpcom/ds  -I/var/tmp/mozilla-central/js/src/xpconnect/src -I. -I../../../../dist/include -I../../../../dist/include/nsprpub  -I/usr/include/nspr -I/usr/include/nss      -fPIC  -fno-rtti -fno-exceptions -Wall -Wpointer-arith -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wcast-align -Wno-invalid-offsetof -Wno-variadic-macros -Werror=return-type -pedantic -Wno-long-long -march=native -ffunction-sections -fdata-sections -fvisibility-inlines-hidden -fpermissive -fno-strict-aliasing -std=gnu++0x -pthread -ffunction-sections -fdata-sections -pipe  -DNDEBUG -DTRIMMED -flto=4 -fno-fat-lto-objects -fprofile-use -fprofile-correction -Wcoverage-mismatch -O3 -fomit-frame-pointer   -DMOZILLA_CLIENT -include ../../../../mozilla-config.h -MD -MF .deps/dombindings.pp /var/tmp/mozilla-central/js/src/xpconnect/src/dombindings.cpp
/var/tmp/mozilla-central/js/src/xpconnect/src/xpcjsruntime.cpp: In member function ‘virtual nsrefcnt MemoryReporter_XPConnectJSGCHeap::Release()’:
/var/tmp/mozilla-central/js/src/xpconnect/src/xpcjsruntime.cpp:1487:1: warning: deleting object of polymorphic class type ‘MemoryReporter_XPConnectJSGCHeap’ which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
/var/tmp/mozilla-central/js/src/xpconnect/src/xpcjsruntime.cpp: In member function ‘virtual nsrefcnt MemoryReporter_XPConnectJSSystemCompartmentCount::Release()’:
/var/tmp/mozilla-central/js/src/xpconnect/src/xpcjsruntime.cpp:1530:1: warning: deleting object of polymorphic class type ‘MemoryReporter_XPConnectJSSystemCompartmentCount’ which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
/var/tmp/mozilla-central/js/src/xpconnect/src/xpcjsruntime.cpp: In member function ‘virtual nsrefcnt MemoryReporter_XPConnectJSUserCompartmentCount::Release()’:
/var/tmp/mozilla-central/js/src/xpconnect/src/xpcjsruntime.cpp:1540:1: warning: deleting object of polymorphic class type ‘MemoryReporter_XPConnectJSUserCompartmentCount’ which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
/var/tmp/mozilla-central/js/src/xpconnect/src/xpcjsruntime.cpp: In member function ‘virtual nsrefcnt XPConnectJSCompartmentsMultiReporter::Release()’:
/var/tmp/mozilla-central/js/src/xpconnect/src/xpcjsruntime.cpp:2009:1: warning: deleting object of polymorphic class type ‘XPConnectJSCompartmentsMultiReporter’ which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
In file included from /var/tmp/mozilla-central/content/html/content/src/nsHTMLSelectElement.h:58:0,
                 from ./dombindings_gen.cpp:3,
                 from /var/tmp/mozilla-central/js/src/xpconnect/src/dombindings.cpp:1109:
/var/tmp/mozilla-central/xpcom/ds/nsCheapSets.h: In member function ‘void nsCheapInt32Set::SetInt(PRInt32)’:
/var/tmp/mozilla-central/xpcom/ds/nsCheapSets.h:178:43: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
In file included from /var/tmp/mozilla-central/js/src/xpconnect/src/dombindings.cpp:1109:0:
./dombindings_gen.cpp: In function ‘mozilla::dom::binding::HTMLOptionsCollection_Add(JSContext*, unsigned int, JS::Value*)’:
./dombindings_gen.cpp:546:1: error: The control flow of function ‘_ZN7mozilla3dom7bindingL25HTMLOptionsCollection_AddEP9JSContextjPN2JS5ValueE’ does not match its profile data (counter ‘arcs’) [-Werror=coverage-mismatch]
./dombindings_gen.cpp:546:1: note: Use -Wno-error=coverage-mismatch to tolerate the mismatch but performance may drop if the function is hot
./dombindings_gen.cpp:546:1: error: The control flow of function ‘_ZN7mozilla3dom7bindingL25HTMLOptionsCollection_AddEP9JSContextjPN2JS5ValueE’ does not match its profile data (counter ‘indirect_call’) [-Werror=coverage-mismatch]
./dombindings_gen.cpp:546:1: note: Use -Wno-error=coverage-mismatch to tolerate the mismatch but performance may drop if the function is hot
./dombindings_gen.cpp: In function ‘mozilla::dom::binding::HTMLOptionsCollection_SetSelectedIndex(JSContext*, JSObject*, long, int, JS::Value*)’:
./dombindings_gen.cpp:546:1: warning: Source location for function ‘_ZN7mozilla3dom7bindingL38HTMLOptionsCollection_SetSelectedIndexEP9JSContextP8JSObjectliPN2JS5ValueE’ have changed, the profile data may be out of date [enabled by default]
./dombindings_gen.cpp:546:1: warning: Source location for function ‘_ZN7mozilla3dom7bindingL38HTMLOptionsCollection_SetSelectedIndexEP9JSContextP8JSObjectliPN2JS5ValueE’ have changed, the profile data may be out of date [enabled by default]
./dombindings_gen.cpp: In function ‘mozilla::dom::binding::HTMLOptionsCollection_GetSelectedIndex(JSContext*, JSObject*, long, JS::Value*)’:
./dombindings_gen.cpp:546:1: warning: Source location for function ‘_ZN7mozilla3dom7bindingL38HTMLOptionsCollection_GetSelectedIndexEP9JSContextP8JSObjectlPN2JS5ValueE’ have changed, the profile data may be out of date [enabled by default]
./dombindings_gen.cpp:546:1: warning: Source location for function ‘_ZN7mozilla3dom7bindingL38HTMLOptionsCollection_GetSelectedIndexEP9JSContextP8JSObjectlPN2JS5ValueE’ have changed, the profile data may be out of date [enabled by default]
./dombindings_gen.cpp: In function ‘mozilla::dom::binding::HTMLOptionsCollection_NamedItem(JSContext*, unsigned int, JS::Value*)’:
./dombindings_gen.cpp:546:1: error: The control flow of function ‘_ZN7mozilla3dom7bindingL31HTMLOptionsCollection_NamedItemEP9JSContextjPN2JS5ValueE’ does not match its profile data (counter ‘arcs’) [-Werror=coverage-mismatch]
./dombindings_gen.cpp:546:1: note: Use -Wno-error=coverage-mismatch to tolerate the mismatch but performance may drop if the function is hot
./dombindings_gen.cpp:546:1: error: The control flow of function ‘_ZN7mozilla3dom7bindingL31HTMLOptionsCollection_NamedItemEP9JSContextjPN2JS5ValueE’ does not match its profile data (counter ‘indirect_call’) [-Werror=coverage-mismatch]
./dombindings_gen.cpp:546:1: note: Use -Wno-error=coverage-mismatch to tolerate the mismatch but performance may drop if the function is hot
cc1plus: some warnings being treated as errors

make[6]: *** [dombindings.o] Error 1
make[6]: *** Waiting for unfinished jobs....

The same issue is mentioned on this blog: http://hidenosuke.org/diary/?date=20111010
(Reporter)

Comment 1

6 years ago
The recent "new DOM list bindings"(Bug 648801) are probably responsible for this.
Perhaps we're regenerating this file on each pass?
(Note that the interesting stuff in comment 0 starts at

In file included from /var/tmp/mozilla-central/js/src/xpconnect/src/dombindings.cpp:1109:0:

.)
What version of GCC are you using?

Comment 5

6 years ago
gcc version is 4:4.6.1-3.
Debian GNU/Linux unstable.
(Reporter)

Comment 6

6 years ago
(In reply to Ted Mielczarek [:ted, :luser] from comment #4)
> What version of GCC are you using?

Latest git version (4.7.0); but note that Hideo Oshima (see the blog link above) uses
an older version and hit the same problem.
So this most likely a problem where the exact GCC version doesn't matter.
(In reply to Kyle Huey [:khuey] (khuey@mozilla.com) from comment #2)
> Perhaps we're regenerating this file on each pass?

Even if that was the case, shouldn't the generated file be the same?

Octoploid: did you try with pgo but without lto?
Except that our tinderbox PGO builds seem to be working fine:
https://tbpl.mozilla.org/php/getParsedLog.php?id=6785362&tree=Firefox&full=1

We're using GCC 4.5.1.
(In reply to Mike Hommey [:glandium] from comment #7)
> Octoploid: did you try with pgo but without lto?

Forget that, hidenosuke doesn't use lto.
(Reporter)

Comment 10

6 years ago
(In reply to Ted Mielczarek [:ted, :luser] from comment #8)
> Except that our tinderbox PGO builds seem to be working fine:
> https://tbpl.mozilla.org/php/getParsedLog.php?id=6785362&tree=Firefox&full=1
> 
> We're using GCC 4.5.1.

Yes, it looks like 4.5.1 is more permissive:

mozilla::dom::binding::HTMLOptionsCollection_NamedItem(JSContext*, uintN, jsval*)':
./dombindings_gen.cpp:546:1: warning: coverage mismatch for function '_ZN7mozilla3dom7bindingL31HTMLOptionsCollection_NamedItemEP9JSContextjPN2JS5ValueE' while reading counter 'arcs'
./dombindings_gen.cpp:546:1: note: checksum is 571250aa instead of 4e5c127b
./dombindings_gen.cpp:546:1: note: coverage mismatch ignored due to -Wcoverage-mismatch
./dombindings_gen.cpp:546:1: note: execution counts estimated
./dombindings_gen.cpp:546:1: warning: coverage mismatch for function '_ZN7mozilla3dom7bindingL31HTMLOptionsCollection_NamedItemEP9JSContextjPN2JS5ValueE' while reading counter 'indirect_call'
./dombindings_gen.cpp:546:1: note: checksum is 571250aa instead of 4e5c127b

While 4.7.0 gives an error for the same mozilla::dom::binding::HTMLOptionsCollection_NamedItem(JSContext*, unsigned int, JS::Value*):

./dombindings_gen.cpp:546:1: error: The control flow of function ‘_ZN7mozilla3dom7bindingL31HTMLOptionsCollection_NamedItemEP9JSContextjPN2JS5ValueE’ does not match its profile data (counter ‘arcs’) [-Werror=coverage-mismatch]
./dombindings_gen.cpp:546:1: note: Use -Wno-error=coverage-mismatch to tolerate the mismatch but performance may drop if the function is hot
./dombindings_gen.cpp:546:1: error: The control flow of function ‘_ZN7mozilla3dom7bindingL31HTMLOptionsCollection_NamedItemEP9JSContextjPN2JS5ValueE’ does not match its profile data (counter ‘indirect_call’) [-Werror=coverage-mismatch]
(Reporter)

Comment 11

6 years ago
One can paper over the problem by using "-Werror=coverage-mismatch" in addition to
"-Wcoverage-mismatch " in PROFILE_USE_CFLAGS.

But the proper solution is to make dombindings_gen.cpp deterministic.
Right now it differs between the runs:

--- dombindings_gen.cpp1	2011-10-11 16:13:24.669964616 +0200
+++ dombindings_gen.cpp2	2011-10-11 16:26:45.943734919 +0200
@@ -278,32 +278,6 @@
 }
 
 static JSBool
-HTMLOptionsCollection_NamedItem(JSContext *cx, uintN argc, jsval *vp)
-{
-    XPC_QS_ASSERT_CONTEXT_OK(cx);
-    JSObject *obj = JS_THIS_OBJECT(cx, vp);
-    if (!obj)
-        return JS_FALSE;
-    JSObject *callee = JSVAL_TO_OBJECT(JS_CALLEE(cx, vp));
-    if (!HTMLOptionsCollectionWrapper::instanceIsListObject(cx, obj, callee))
-        return false;
-    if (argc < 1)
-        return xpc_qsThrow(cx, NS_ERROR_XPC_NOT_ENOUGH_ARGS);
-    jsval *argv = JS_ARGV(cx, vp);
-    xpc_qsDOMString arg0(cx, argv[0], &argv[0], xpc_qsDOMString::eDefaultNullBehavior, xpc_qsDOMString::eDefaultUndefinedBehavior);
-    if (!arg0.IsValid())
-        return JS_FALSE;
-    nsWrapperCache *cache;
-    nsISupports *result;
-    result = HTMLOptionsCollectionWrapper::getListObject(obj)->GetNamedItem(arg0, &cache);
-    if (!result) {
-      *vp = JSVAL_NULL;
-      return JS_TRUE;
-    }
-    return Wrap(cx, obj, result, cache, vp);
-}
-
-static JSBool
 HTMLOptionsCollection_Item(JSContext *cx, uintN argc, jsval *vp)
 {
     XPC_QS_ASSERT_CONTEXT_OK(cx);
@@ -352,62 +326,88 @@
 }
 
 static JSBool
-HTMLOptionsCollection_Remove(JSContext *cx, uintN argc, jsval *vp)
+HTMLOptionsCollection_GetSelectedIndex(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
 {
     XPC_QS_ASSERT_CONTEXT_OK(cx);
-    JSObject *obj = JS_THIS_OBJECT(cx, vp);
-    if (!obj)
-        return JS_FALSE;
-    JSObject *callee = JSVAL_TO_OBJECT(JS_CALLEE(cx, vp));
-    if (!HTMLOptionsCollectionWrapper::instanceIsListObject(cx, obj, callee))
+    if (!HTMLOptionsCollectionWrapper::instanceIsListObject(cx, obj, NULL))
         return false;
-    if (argc < 1)
-        return xpc_qsThrow(cx, NS_ERROR_XPC_NOT_ENOUGH_ARGS);
-    jsval *argv = JS_ARGV(cx, vp);
-    int32 arg0;
-    if (!JS_ValueToECMAInt32(cx, argv[0], &arg0))
-        return JS_FALSE;
     nsresult rv;
-    rv = HTMLOptionsCollectionWrapper::getListObject(obj)->Remove(arg0);
+    PRInt32 result;
+    rv = HTMLOptionsCollectionWrapper::getListObject(obj)->GetSelectedIndex(&result);
     if (NS_FAILED(rv)) {
-        xpc_qsThrowMethodFailedWithDetails(cx, rv, "HTMLOptionsCollection", "remove");
+        xpc_qsThrowMethodFailedWithDetails(cx, rv, "HTMLOptionsCollection", "selectedIndex");
         return JS_FALSE;
     }
-    *vp = JSVAL_VOID;
-    return JS_TRUE;
+    return xpc_qsInt32ToJsval(cx, result, vp);
 }
 
 static JSBool
-HTMLOptionsCollection_GetSelectedIndex(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
+HTMLOptionsCollection_SetSelectedIndex(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp)
 {
     XPC_QS_ASSERT_CONTEXT_OK(cx);
     if (!HTMLOptionsCollectionWrapper::instanceIsListObject(cx, obj, NULL))
         return false;
+    int32 arg0;
+    if (!JS_ValueToECMAInt32(cx, *vp, &arg0))
+        return JS_FALSE;
     nsresult rv;
-    PRInt32 result;
-    rv = HTMLOptionsCollectionWrapper::getListObject(obj)->GetSelectedIndex(&result);
+    rv = HTMLOptionsCollectionWrapper::getListObject(obj)->SetSelectedIndex(arg0);
     if (NS_FAILED(rv)) {
         xpc_qsThrowMethodFailedWithDetails(cx, rv, "HTMLOptionsCollection", "selectedIndex");
         return JS_FALSE;
     }
-    return xpc_qsInt32ToJsval(cx, result, vp);
+    return JS_TRUE;
 }
 
 static JSBool
-HTMLOptionsCollection_SetSelectedIndex(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp)
+HTMLOptionsCollection_NamedItem(JSContext *cx, uintN argc, jsval *vp)
 {
     XPC_QS_ASSERT_CONTEXT_OK(cx);
-    if (!HTMLOptionsCollectionWrapper::instanceIsListObject(cx, obj, NULL))
+    JSObject *obj = JS_THIS_OBJECT(cx, vp);
+    if (!obj)
+        return JS_FALSE;
+    JSObject *callee = JSVAL_TO_OBJECT(JS_CALLEE(cx, vp));
+    if (!HTMLOptionsCollectionWrapper::instanceIsListObject(cx, obj, callee))
+        return false;
+    if (argc < 1)
+        return xpc_qsThrow(cx, NS_ERROR_XPC_NOT_ENOUGH_ARGS);
+    jsval *argv = JS_ARGV(cx, vp);
+    xpc_qsDOMString arg0(cx, argv[0], &argv[0], xpc_qsDOMString::eDefaultNullBehavior, xpc_qsDOMString::eDefaultUndefinedBehavior);
+    if (!arg0.IsValid())
+        return JS_FALSE;
+    nsWrapperCache *cache;
+    nsISupports *result;
+    result = HTMLOptionsCollectionWrapper::getListObject(obj)->GetNamedItem(arg0, &cache);
+    if (!result) {
+      *vp = JSVAL_NULL;
+      return JS_TRUE;
+    }
+    return Wrap(cx, obj, result, cache, vp);
+}
+
+static JSBool
+HTMLOptionsCollection_Remove(JSContext *cx, uintN argc, jsval *vp)
+{
+    XPC_QS_ASSERT_CONTEXT_OK(cx);
+    JSObject *obj = JS_THIS_OBJECT(cx, vp);
+    if (!obj)
+        return JS_FALSE;
+    JSObject *callee = JSVAL_TO_OBJECT(JS_CALLEE(cx, vp));
+    if (!HTMLOptionsCollectionWrapper::instanceIsListObject(cx, obj, callee))
         return false;
+    if (argc < 1)
+        return xpc_qsThrow(cx, NS_ERROR_XPC_NOT_ENOUGH_ARGS);
+    jsval *argv = JS_ARGV(cx, vp);
     int32 arg0;
-    if (!JS_ValueToECMAInt32(cx, *vp, &arg0))
+    if (!JS_ValueToECMAInt32(cx, argv[0], &arg0))
         return JS_FALSE;
     nsresult rv;
-    rv = HTMLOptionsCollectionWrapper::getListObject(obj)->SetSelectedIndex(arg0);
+    rv = HTMLOptionsCollectionWrapper::getListObject(obj)->Remove(arg0);
     if (NS_FAILED(rv)) {
-        xpc_qsThrowMethodFailedWithDetails(cx, rv, "HTMLOptionsCollection", "selectedIndex");
+        xpc_qsThrowMethodFailedWithDetails(cx, rv, "HTMLOptionsCollection", "remove");
         return JS_FALSE;
     }
+    *vp = JSVAL_VOID;
     return JS_TRUE;
 }
 
@@ -420,8 +420,8 @@
 template<>
 HTMLOptionsCollectionWrapper::Methods HTMLOptionsCollectionWrapper::sProtoMethods[] = {
     { s_add_id, HTMLOptionsCollection_Add, 2 },
-    { s_namedItem_id, HTMLOptionsCollection_NamedItem, 1 },
     { s_item_id, HTMLOptionsCollection_Item, 1 },
+    { s_namedItem_id, HTMLOptionsCollection_NamedItem, 1 },
     { s_remove_id, HTMLOptionsCollection_Remove, 1 }
 };
Yeah, if the file is varying between runs something is really broken.  Peterv?
It looks like the order it's writing things out it just isn't stable?
Arguably, it should be generated once.
Yes, but generating it multiple times should generate the same file, IMO.
So, one half of the problem is the script not being stable, the other half is make maybe_clobber_profiledbuild between the two passes. Bug 659311 would take care of the latter.

Updated

6 years ago
Blocks: 648801
(Assignee)

Comment 17

6 years ago
(In reply to Kyle Huey [:khuey] (khuey@mozilla.com) from comment #15)
> Yes, but generating it multiple times should generate the same file, IMO.

That was certainly the intent.
(Assignee)

Updated

6 years ago
Assignee: nobody → peterv
Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true
(Assignee)

Comment 18

6 years ago
Created attachment 566319 [details] [diff] [review]
v1

Could someone try this patch and see if that fixes it?
(Reporter)

Comment 19

6 years ago
(In reply to Peter Van der Beken [:peterv] from comment #18)
> Created attachment 566319 [details] [diff] [review] [diff] [details] [review]
> v1
> 
> Could someone try this patch and see if that fixes it?

Yes, it does fix the issue. Many thanks.
(Assignee)

Comment 20

6 years ago
Comment on attachment 566319 [details] [diff] [review]
v1

This just sorts the properties by name, so we always write them out in the same order.
Attachment #566319 - Flags: review?(jst)
Assignee: peterv → nobody
Component: Build Config → Build Config
Product: Firefox → Core
QA Contact: build.config → build-config
Assignee: nobody → peterv
Component: Build Config → DOM
OS: Linux → All
QA Contact: build-config → general
Hardware: x86_64 → All
Summary: coverage-mismatch in dombindings_gen.cpp:546:1 (profiledbuild) → Generating dombindings_gen.cpp multiple times results in a different file

Updated

6 years ago
Attachment #566319 - Flags: review?(jst) → review+

Comment 21

6 years ago
(In reply to Octoploid from comment #19)
> (In reply to Peter Van der Beken [:peterv] from comment #18)
> > Created attachment 566319 [details] [diff] [review] [diff] [details] [review] [diff] [details] [review]
> > v1
> > 
> > Could someone try this patch and see if that fixes it?
> 
> Yes, it does fix the issue. Many thanks.

Me too. Thanks for great work.
(Assignee)

Comment 22

6 years ago
https://hg.mozilla.org/integration/mozilla-inbound/rev/10089dd4bd85
Target Milestone: --- → mozilla10
https://hg.mozilla.org/mozilla-central/rev/10089dd4bd85
Status: ASSIGNED → RESOLVED
Last Resolved: 6 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.