compile: cnames for classes and modules
authorJean Privat <jean@pryen.org>
Fri, 23 Jul 2010 08:08:41 +0000 (04:08 -0400)
committerJean Privat <jean@pryen.org>
Sat, 2 Apr 2011 08:29:13 +0000 (04:29 -0400)
Allow the compilation of programs with class name conflicts and submodule name conflicts.

note: fix valgrind script to inlude new name mangling

Signed-off-by: Jean Privat <jean@pryen.org>

21 files changed:
src/compiling/compiling.nit
src/compiling/compiling_base.nit
src/compiling/compiling_global.nit
src/compiling/compiling_icode.nit
src/valgrind.sh
tests/base_conflict_class_name.nit [new file with mode: 0644]
tests/base_conflict_class_name_submodule1.nit [new file with mode: 0644]
tests/base_conflict_class_name_submodule2.nit [new file with mode: 0644]
tests/base_conflict_submodule_name.nit [new file with mode: 0644]
tests/base_conflict_submodule_name_submodule1/base_conflict_submodule_name_submodule1.nit [new file with mode: 0644]
tests/base_conflict_submodule_name_submodule1/submodule.nit [new file with mode: 0644]
tests/base_conflict_submodule_name_submodule2/base_conflict_submodule_name_submodule2.nit [new file with mode: 0644]
tests/base_conflict_submodule_name_submodule2/submodule.nit [new file with mode: 0644]
tests/sav/base_conflict_class_name.sav [new file with mode: 0644]
tests/sav/base_conflict_class_name_alt1.sav [new file with mode: 0644]
tests/sav/base_conflict_class_name_alt2.sav [new file with mode: 0644]
tests/sav/base_conflict_class_name_submodule1.sav [new file with mode: 0644]
tests/sav/base_conflict_class_name_submodule2.sav [new file with mode: 0644]
tests/sav/base_conflict_submodule_name.sav [new file with mode: 0644]
tests/sav/base_conflict_submodule_name_alt1.sav [new file with mode: 0644]
tests/sav/base_conflict_submodule_name_alt2.sav [new file with mode: 0644]

index 8dcadba..b71b827 100644 (file)
@@ -75,10 +75,10 @@ redef class Program
                v.add_decl("#include <nit_common.h>")
                compile_tables_to_c(v)
                compile_main_part(v)
-               var filename = "{cprogram.compdir}/{main_module.name}._tables.c"
+               var filename = "{cprogram.compdir}/{main_module.cname}._tables.c"
                cprogram.files.add(filename)
                var f = new OFStream.open(filename)
-               f.write("/* This C file is generated by NIT to compile program {main_module.name}. */\n")
+               f.write("/* This C file is generated by NIT to compile program {main_module.cname}. */\n")
                for m in main_module.mhe.greaters_and_self do
                        f.write("#include \"{cprogram.module_header_name(m)}\"\n")
                end
@@ -93,7 +93,7 @@ redef class MMModule
        private fun compile_separate_module(cprogram: CProgram)
        do
                var tc = cprogram.program.tc
-               tc.info("Generating C code for module: {name}",2)
+               tc.info("Generating C code for module: {full_name}",2)
                var v = new CompilerVisitor(self, cprogram)
                v.add_decl("#include <nit_common.h>")
 
@@ -111,18 +111,18 @@ redef class MMModule
 
                var hfilename = cprogram.module_header_name(self)
                var f = new OFStream.open("{cprogram.compdir}/{hfilename}")
-               f.write("/* This C header file is generated by NIT to compile modules and programs that requires {name}. */\n")
-               f.write("#ifndef {name}{cprogram.get_file_ending}\n")
-               f.write("#define {name}{cprogram.get_file_ending}\n")
+               f.write("/* This C header file is generated by NIT to compile modules and programs that requires {full_name}. */\n")
+               f.write("#ifndef {cname}{cprogram.get_file_ending}\n")
+               f.write("#define {cname}{cprogram.get_file_ending}\n")
                for m in mhe.direct_greaters do f.write("#include \"{cprogram.module_header_name(m)}\"\n")
                v.header_writer.write_to_stream(f)
                f.write("#endif\n")
                f.close
 
-               var cfilename = "{cprogram.compdir}/{name}.{cprogram.get_file_ending}.c"
+               var cfilename = "{cprogram.compdir}/{cname}.{cprogram.get_file_ending}.c"
                cprogram.files.add(cfilename)
                f = new OFStream.open("{cfilename}")
-               f.write("/* This C file is generated by NIT to compile module {name}. */\n")
+               f.write("/* This C file is generated by NIT to compile module {cname}. */\n")
                f.write("#include \"{hfilename}\"\n")
                v.top_writer.write_to_stream(f)
                f.close
index 24d4fcb..e6f7f9a 100644 (file)
@@ -43,7 +43,7 @@ class CProgram
        do
                _program = p
                _compdir = p.tc.compdir.as(not null)
-               _build_file = "{compdir}/{program.main_module.name}._build.sh"
+               _build_file = "{compdir}/{program.main_module.cname}._build.sh"
        end
 
        # The Nit program compiled to C
@@ -67,7 +67,7 @@ class CProgram
                if _module_include.has_key(m) then
                        return _module_include[m]
                end
-               var filename = "{m.name}.{get_file_ending}.h"
+               var filename = "{m.cname}.{get_file_ending}.h"
                _module_include[m] = filename
                return filename
        end
@@ -94,7 +94,7 @@ class CProgram
                end
 
                f.write("#!/bin/sh\n")
-               f.write("# This shell script is generated by NIT to compile the program {program.main_module.name}.\n")
+               f.write("# This shell script is generated by NIT to compile the program {program.main_module.full_name}.\n")
                f.write("CLIBDIR=\"{tc.clibdir.as(not null)}\"\n")
                f.write("{tc.bindir.as(not null)}/gccx {verbose} -d {compdir} -I $CLIBDIR {include_dirs.join(" ")}")
                if tc.output_file != null then
@@ -249,25 +249,68 @@ redef class MMGlobalProperty
 end
 
 redef class MMGlobalClass
+       # Cacher result of cname
+       var _cname_cache: nullable String
+
+       # The mangled name of the global class
+       fun cname: String
+       do
+               var cname = _cname_cache
+               if cname == null then
+                       cname = intro.mmmodule.cname + "___" + cmangle(intro.name)
+                       _cname_cache = cname
+               end
+               return cname
+       end
+
        # C symbol refering the identifier of the class
        fun id_id: String
        do
-               return "ID_{intro.name}"
+               return "ID_{cname}"
        end
 
        # C symbol refering the color of the class (for subtype tests)
        fun color_id: String
        do
-               return "COLOR_{intro.name}"
+               return "COLOR_{cname}"
        end
 
        # C symbol refering the init table position of the class (for constructor linearization)
        fun init_table_pos_id: String
        do
-               return "INIT_TABLE_POS_{intro.name}"
+               return "INIT_TABLE_POS_{cname}"
+       end
+end
+
+redef class MMModule
+       # Cacher result of cname
+       var _cname_cache: nullable String
+
+       # The mangled name of the module
+       fun cname: String
+       do
+               var cname = _cname_cache
+               if cname == null then
+                       var l = new List[String]
+                       var m: nullable MMModule = self
+                       while m != null do
+                               l.unshift(cmangle(m.name))
+                               var d: nullable MMDirectory = m.directory
+                               while d != null and d.owner == m do d = d.parent
+                               if d == null then m = null else m = d.owner
+                       end
+                       cname = l.to_a.join("___")
+                       _cname_cache = cname
+               end
+               return cname
        end
 end
 
+redef class MMLocalClass
+       # The mangled name of the global class
+       fun cname: String do return global.cname
+end
+
 redef class MMLocalProperty
        # Cacher result of cname
        var _cname_cache: nullable String
@@ -277,7 +320,7 @@ redef class MMLocalProperty
        do
                var cname = _cname_cache
                if cname == null then
-                       cname = cmangle(mmmodule.name, local_class.name, name)
+                       cname = mmmodule.cname + "___" + cmangle(local_class.name, name)
                        _cname_cache = cname
                end
                return cname
index da63476..1dac70b 100644 (file)
@@ -36,7 +36,8 @@ redef class Program
                var s = new Buffer.from("classtable_t TAG2VFT[4] = \{NULL")
                for t in ["Int","Char","Bool"] do
                        if main_module.has_global_class_named(t.to_symbol) then
-                               s.append(", (const classtable_t)VFT_{t}")
+                               var c = main_module.class_by_name(t.to_symbol)
+                               s.append(", (const classtable_t)VFT_{c.cname}")
                        else
                                s.append(", NULL")
                        end
@@ -55,7 +56,8 @@ redef class Program
                if v.program.main_method == null then
                        print("No main")
                else
-                       v.add_instr("G_sys = NEW_Sys();")
+                       var c = v.program.main_class
+                       v.add_instr("G_sys = NEW_{c.cname}();")
                        v.add_instr("register_static_object(&G_sys);")
                        v.add_instr("{v.program.main_method.cname}(G_sys);")
                end
@@ -79,9 +81,9 @@ redef class MMModule
        # Compile sep files
        fun compile_mod_to_c(v: CompilerVisitor)
        do
-               v.add_decl("extern const char *LOCATE_{name};")
+               v.add_decl("extern const char *LOCATE_{cname};")
                if not v.program.tc.use_SFT_optimization then
-                       v.add_decl("extern const int SFT_{name}[];")
+                       v.add_decl("extern const int SFT_{cname}[];")
                end
                var i = 0
                for e in local_table do
@@ -89,7 +91,7 @@ redef class MMModule
                        if v.program.tc.use_SFT_optimization then
                                value = "{e.value(v.program)}"
                        else
-                               value = "SFT_{name}[{i}]"
+                               value = "SFT_{cname}[{i}]"
                                i = i + 1
                        end
                        e.compile_macros(v, value)
@@ -116,13 +118,13 @@ redef class MMModule
        # Compile module file for the current module
        fun compile_local_table_to_c(v: CompilerVisitor)
        do
-               v.add_instr("const char *LOCATE_{name} = \"{location.file}\";")
+               v.add_instr("const char *LOCATE_{cname} = \"{location.file}\";")
 
                if v.program.tc.use_SFT_optimization or local_table.is_empty then
                        return
                end
 
-               v.add_instr("const int SFT_{name}[{local_table.length}] = \{")
+               v.add_instr("const int SFT_{cname}[{local_table.length}] = \{")
                v.indent
                for e in local_table do
                        v.add_instr(e.value(v.program) + ",")
@@ -323,7 +325,7 @@ redef class MMLocalClass
        do
                v.add_decl("")
                var pi = primitive_info
-               v.add_decl("extern const classtable_elt_t VFT_{name}[];")
+               v.add_decl("extern const classtable_elt_t VFT_{cname}[];")
                if pi != null and not pi.tagged then
                        var t = pi.cname
                        var tbox = "struct TBOX_{name}"
@@ -343,7 +345,7 @@ redef class MMLocalClass
                        clen = v.program.table_information.max_class_table_length
                end
 
-               v.add_instr("const classtable_elt_t VFT_{name}[{clen}] = \{")
+               v.add_instr("const classtable_elt_t VFT_{cname}[{clen}] = \{")
                v.indent
                for e in ctab do
                        if e == null then
@@ -372,7 +374,7 @@ redef class MMLocalClass
                        v.indent
                        v.add_instr("Nit_NativeArray array;")
                        v.add_instr("array = (Nit_NativeArray)alloc(sizeof(struct Nit_NativeArray) + ((length - 1) * size));")
-                       v.add_instr("array->vft = (classtable_elt_t*)VFT_{name};")
+                       v.add_instr("array->vft = (classtable_elt_t*)VFT_{cname};")
                        v.add_instr("array->object_id = object_id_counter;")
                        v.add_instr("object_id_counter = object_id_counter + 1;")
                        v.add_instr("array->size = length;")
@@ -382,7 +384,7 @@ redef class MMLocalClass
                else if pi == null then
                        do
                                # Generate INIT_ATTRIBUTES routine
-                               var cname = "INIT_ATTRIBUTES__{name}"
+                               var cname = "INIT_ATTRIBUTES__{cname}"
                                var args = init_var_iroutine.compile_signature_to_c(v, cname, "init var of {name}", null, null)
                                var decl_writer_old = v.decl_writer
                                v.decl_writer = v.writer.sub
@@ -393,13 +395,13 @@ redef class MMLocalClass
                        end
                        do
                                # Generate NEW routine
-                               v.add_decl("val_t NEW_{name}(void);")
-                               v.add_instr("val_t NEW_{name}(void)")
+                               v.add_decl("val_t NEW_{cname}(void);")
+                               v.add_instr("val_t NEW_{cname}(void)")
                                v.add_instr("\{")
                                v.indent
                                v.add_instr("obj_t obj;")
                                v.add_instr("obj = alloc(sizeof(val_t) * {itab.length});")
-                               v.add_instr("obj->vft = (classtable_elt_t*)VFT_{name};")
+                               v.add_instr("obj->vft = (classtable_elt_t*)VFT_{cname};")
                                v.add_instr("obj[1].object_id = object_id_counter;")
                                v.add_instr("object_id_counter = object_id_counter + 1;")
                                v.add_instr("return OBJ2VAL(obj);")
@@ -408,7 +410,7 @@ redef class MMLocalClass
                        end
                        do
                                # Compile CHECKNAME
-                               var cname = "CHECKNEW_{name}"
+                               var cname = "CHECKNEW_{cname}"
                                var args = checknew_iroutine.compile_signature_to_c(v, cname, "check new {name}", null, null)
                                var decl_writer_old = v.decl_writer
                                v.decl_writer = v.writer.sub
@@ -444,7 +446,7 @@ redef class MMLocalClass
                        v.add_instr("val_t BOX_{name}({t} val) \{")
                        v.indent
                        v.add_instr("{tbox} *box = ({tbox}*)alloc(sizeof({tbox}));")
-                       v.add_instr("box->vft = VFT_{name};")
+                       v.add_instr("box->vft = VFT_{cname};")
                        v.add_instr("box->val = val;")
                        v.add_instr("box->object_id = object_id_counter;")
                        v.add_instr("object_id_counter = object_id_counter + 1;")
index 00e87c4..a805219 100644 (file)
@@ -289,7 +289,7 @@ redef class IRoutine
                        v.add_decl("struct \{struct stack_frame_t me;\} fra;")
                end
                v.add_instr("fra.me.prev = stack_frame_head; stack_frame_head = &fra.me;")
-               v.add_instr("fra.me.file = LOCATE_{v.visitor.mmmodule.name};")
+               v.add_instr("fra.me.file = LOCATE_{v.visitor.mmmodule.cname};")
                v.add_instr("fra.me.line = {ll};")
                v.add_instr("fra.me.meth = LOCATE_{v.basecname};")
                v.add_instr("fra.me.has_broke = 0;")
@@ -624,7 +624,7 @@ redef class IAllocateInstance
                v.add_location(location)
                var w = new_result(v)
                w.add("NEW_")
-               w.add(stype.local_class.name.to_s)
+               w.add(stype.local_class.cname)
                w.add("()")
        end
 end
@@ -635,7 +635,7 @@ redef class ICheckInstance
                v.add_location(location)
                var w = new_result(v)
                w.add("CHECKNEW_")
-               w.add(stype.local_class.name.to_s)
+               w.add(stype.local_class.cname)
                w.add("(")
                w.add(v.register(expr))
                w.add(")")
@@ -648,7 +648,7 @@ redef class IInitAttributes
                v.add_location(location)
                var w = v.new_instr
                w.add("INIT_ATTRIBUTES__")
-               w.add(stype.local_class.name.to_s)
+               w.add(stype.local_class.cname)
                w.add("(")
                w.add(v.register(expr))
                w.add(");\n")
@@ -943,7 +943,7 @@ redef class IAbort
                        w.add("\", NULL")
                end
                w.add(", LOCATE_")
-               w.add(module_location.name.to_s)
+               w.add(module_location.cname)
                var ll = location
                if ll != null then
                        w.add(", ")
index c024763..d34dfd7 100755 (executable)
@@ -7,4 +7,4 @@ NIT_GC_OPTION=large
 export NIT_GC_OPTION
 
 # Skip usual methods with blocks to avoid loops
-exec valgrind --tool=callgrind --fn-skip=array___Array___iterate --fn-skip=abstract_collection___Collection___iterate --fn-skip=parser_prod___Visitor___enter_visit "$@"
+exec valgrind --tool=callgrind --fn-skip=array___Array___iterate --fn-skip=abstract_collection___Collection___iterate --fn-skip=parser_prod___Visitor___enter_visit --fn-skip=standard___collection___abstract_collection___Collection___iterate --fn-skip=standard___collection___array___Array___iterate "$@"
diff --git a/tests/base_conflict_class_name.nit b/tests/base_conflict_class_name.nit
new file mode 100644 (file)
index 0000000..74ca118
--- /dev/null
@@ -0,0 +1,23 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import base_conflict_class_name_submodule1
+import base_conflict_class_name_submodule2
+
+var a1 = newa1
+fooa1(a1)
+var a2 = newa2
+fooa2(a2)
+#alt1#fooa1(a2)
+#alt2#fooa2(a1)
diff --git a/tests/base_conflict_class_name_submodule1.nit b/tests/base_conflict_class_name_submodule1.nit
new file mode 100644 (file)
index 0000000..1879ac3
--- /dev/null
@@ -0,0 +1,22 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+class A
+       fun foo do 1.output
+end
+
+fun newa1: Object do return new A
+fun fooa1(a: Object) do a.as(A).foo
diff --git a/tests/base_conflict_class_name_submodule2.nit b/tests/base_conflict_class_name_submodule2.nit
new file mode 100644 (file)
index 0000000..3a6c056
--- /dev/null
@@ -0,0 +1,22 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+class A
+       fun foo do 2.output
+end
+
+fun newa2: Object do return new A
+fun fooa2(a: Object) do a.as(A).foo
diff --git a/tests/base_conflict_submodule_name.nit b/tests/base_conflict_submodule_name.nit
new file mode 100644 (file)
index 0000000..f1e2250
--- /dev/null
@@ -0,0 +1,23 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import base_conflict_submodule_name_submodule1
+import base_conflict_submodule_name_submodule2
+
+var a1 = newa1
+fooa1(a1)
+var a2 = newa2
+fooa2(a2)
+#alt1#fooa1(a2)
+#alt2#fooa2(a1)
diff --git a/tests/base_conflict_submodule_name_submodule1/base_conflict_submodule_name_submodule1.nit b/tests/base_conflict_submodule_name_submodule1/base_conflict_submodule_name_submodule1.nit
new file mode 100644 (file)
index 0000000..1960a71
--- /dev/null
@@ -0,0 +1 @@
+import submodule
diff --git a/tests/base_conflict_submodule_name_submodule1/submodule.nit b/tests/base_conflict_submodule_name_submodule1/submodule.nit
new file mode 100644 (file)
index 0000000..1879ac3
--- /dev/null
@@ -0,0 +1,22 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+class A
+       fun foo do 1.output
+end
+
+fun newa1: Object do return new A
+fun fooa1(a: Object) do a.as(A).foo
diff --git a/tests/base_conflict_submodule_name_submodule2/base_conflict_submodule_name_submodule2.nit b/tests/base_conflict_submodule_name_submodule2/base_conflict_submodule_name_submodule2.nit
new file mode 100644 (file)
index 0000000..1960a71
--- /dev/null
@@ -0,0 +1 @@
+import submodule
diff --git a/tests/base_conflict_submodule_name_submodule2/submodule.nit b/tests/base_conflict_submodule_name_submodule2/submodule.nit
new file mode 100644 (file)
index 0000000..3a6c056
--- /dev/null
@@ -0,0 +1,22 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+class A
+       fun foo do 2.output
+end
+
+fun newa2: Object do return new A
+fun fooa2(a: Object) do a.as(A).foo
diff --git a/tests/sav/base_conflict_class_name.sav b/tests/sav/base_conflict_class_name.sav
new file mode 100644 (file)
index 0000000..1191247
--- /dev/null
@@ -0,0 +1,2 @@
+1
+2
diff --git a/tests/sav/base_conflict_class_name_alt1.sav b/tests/sav/base_conflict_class_name_alt1.sav
new file mode 100644 (file)
index 0000000..21da3c5
--- /dev/null
@@ -0,0 +1,3 @@
+1
+2
+Cast failed (./base_conflict_class_name_submodule1.nit:22)
diff --git a/tests/sav/base_conflict_class_name_alt2.sav b/tests/sav/base_conflict_class_name_alt2.sav
new file mode 100644 (file)
index 0000000..f1b42be
--- /dev/null
@@ -0,0 +1,3 @@
+1
+2
+Cast failed (./base_conflict_class_name_submodule2.nit:22)
diff --git a/tests/sav/base_conflict_class_name_submodule1.sav b/tests/sav/base_conflict_class_name_submodule1.sav
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/sav/base_conflict_class_name_submodule2.sav b/tests/sav/base_conflict_class_name_submodule2.sav
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/sav/base_conflict_submodule_name.sav b/tests/sav/base_conflict_submodule_name.sav
new file mode 100644 (file)
index 0000000..1191247
--- /dev/null
@@ -0,0 +1,2 @@
+1
+2
diff --git a/tests/sav/base_conflict_submodule_name_alt1.sav b/tests/sav/base_conflict_submodule_name_alt1.sav
new file mode 100644 (file)
index 0000000..53131dc
--- /dev/null
@@ -0,0 +1,3 @@
+1
+2
+Cast failed (./base_conflict_submodule_name_submodule1//submodule.nit:22)
diff --git a/tests/sav/base_conflict_submodule_name_alt2.sav b/tests/sav/base_conflict_submodule_name_alt2.sav
new file mode 100644 (file)
index 0000000..4354f78
--- /dev/null
@@ -0,0 +1,3 @@
+1
+2
+Cast failed (./base_conflict_submodule_name_submodule2//submodule.nit:22)