Skip to content

Commit

Permalink
Merge pull request #3707 from michaellilltokiwa/issue/3647
Browse files Browse the repository at this point in the history
fe: fix check condition failure
  • Loading branch information
fridis committed Sep 12, 2024
2 parents 04eed87 + bfd0574 commit c8baddb
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 13 deletions.
23 changes: 14 additions & 9 deletions src/dev/flang/ast/AstErrors.java
Original file line number Diff line number Diff line change
Expand Up @@ -944,23 +944,28 @@ public static void repeatedInheritanceCannotBeResolved(SourcePosition pos, Abstr
"To solve this, you could add a redefinition of " + sbnf(f1) + " to " + s(heir) + ".");
}

public static void duplicateFeatureDeclaration(SourcePosition pos, AbstractFeature f, AbstractFeature existing)
public static void duplicateFeatureDeclaration(AbstractFeature a, AbstractFeature b)
{
// suppress error message if errors were reported already and any feature
// involved is f_ERROR
if (!any() || (f != Types.f_ERROR &&
f .outer() != Types.f_ERROR &&
existing != Types.f_ERROR &&
existing.outer() != Types.f_ERROR ))
if (!any() || (a != Types.f_ERROR &&
a .outer() != Types.f_ERROR &&
b != Types.f_ERROR &&
b.outer() != Types.f_ERROR ))
{
var of = f.isTypeFeature() ? f.typeFeatureOrigin() : f;
error(pos,
// report in source code order to avoid symmetric error with exchanged roles of f and existing
var cmpRes = a.pos().show().compareTo(b.pos().show())>0;
var aa = cmpRes ? a : b;
var bb = cmpRes ? b : a;

var of = aa.isTypeFeature() ? aa.typeFeatureOrigin() : aa;
error(bb.pos(),
"Duplicate feature declaration",
"Feature that was declared repeatedly: " + s(of) + "\n" +
"originally declared at " + existing.pos().show() + "\n" +
"originally declared at " + aa.pos().show() + "\n" +
"To solve this, consider renaming one of these two features, e.g., as " + sbn(of.featureName().baseNameHuman() + "ʼ") +
" (using a unicode modifier letter apostrophe " + sbn("ʼ")+ " U+02BC) "+
(f.isTypeFeature()
(aa.isTypeFeature()
? ("or changing it into a routine by returning a " +
sbn("unit") + " result, i.e., adding " + sbn("unit") + " before " + code("is") + " or using " + code("=>") +
" instead of "+ code("is") + ".")
Expand Down
8 changes: 4 additions & 4 deletions src/dev/flang/fe/SourceModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,7 @@ public void addTypeParameter(AbstractFeature outer,
if (doi != null)
{
if (CHECKS) check
(!doi.containsKey(fn) || doi.get(fn).size() == 1 && doi.get(fn).getFirst() == typeParameter);
(Errors.any() || !doi.containsKey(fn) || doi.get(fn).size() == 1 && doi.get(fn).getFirst() == typeParameter);
add(doi, fn, typeParameter);
}
}
Expand Down Expand Up @@ -976,7 +976,7 @@ void addDeclaredInnerFeature(AbstractFeature outer, Feature f)
}
else
{
if (existing instanceof Feature ef && ef.isArgument() && f.isArgument())
if (existing instanceof Feature ef && ef.isArgument() && f.isArgument() && !f.isTypeParameter())
{
// NYI: CLEANUP: there should not be two places where
// similar error is raised.
Expand All @@ -986,7 +986,7 @@ void addDeclaredInnerFeature(AbstractFeature outer, Feature f)
}
else
{
AstErrors.duplicateFeatureDeclaration(f.pos(), f, existing);
AstErrors.duplicateFeatureDeclaration(f, existing);
}
}
}
Expand Down Expand Up @@ -1902,7 +1902,7 @@ private void checkDuplicateFeatures(AbstractFeature outer, FeatureName fn, List<
else
{
// NYI: if (!isInherited && !sameModule(f, outer))
AstErrors.duplicateFeatureDeclaration(f1.pos(), f1, f2);
AstErrors.duplicateFeatureDeclaration(f1, f2);
}
}
}
Expand Down
25 changes: 25 additions & 0 deletions tests/reg_issue3647/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# This file is part of the Fuzion language implementation.
#
# The Fuzion language implementation is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, version 3 of the License.
#
# The Fuzion language implementation is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License along with The
# Fuzion language implementation. If not, see <https://www.gnu.org/licenses/>.


# -----------------------------------------------------------------------
#
# Tokiwa Software GmbH, Germany
#
# Source code of Fuzion test Makefile
#
# -----------------------------------------------------------------------

override NAME = reg_issue3647
include ../simple.mk
28 changes: 28 additions & 0 deletions tests/reg_issue3647/reg_issue3647.fz
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# This file is part of the Fuzion language implementation.
#
# The Fuzion language implementation is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, version 3 of the License.
#
# The Fuzion language implementation is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License along with The
# Fuzion language implementation. If not, see <https://www.gnu.org/licenses/>.


# -----------------------------------------------------------------------
#
# Tokiwa Software GmbH, Germany
#
# Source code of Fuzion test reg_issue3647
#
# -----------------------------------------------------------------------

reg_issue3647 =>

Node(T Type, a Node T) ref is

say (type_as_value (Node i32))
11 changes: 11 additions & 0 deletions tests/reg_issue3647/reg_issue3647.fz.expected_err
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@

--CURDIR--/reg_issue3647.fz:26:23: error 1: Duplicate feature declaration
Node(T Type, a Node T) ref is
----------------------^
Feature that was declared repeatedly: 'reg_issue3647.Node.T'
originally declared at --CURDIR--/reg_issue3647.fz:26:8:
Node(T Type, a Node T) ref is
-------^
To solve this, consider renaming one of these two features, e.g., as 'Tʼ' (using a unicode modifier letter apostrophe 'ʼ' U+02BC) or adding an additional argument (e.g. '_ unit' for an ignored unit argument used only to disambiguate these two).

one error.
Empty file.

0 comments on commit c8baddb

Please sign in to comment.