diff --git a/k-distribution/tests/regression-new/checks/checkNoSymbolOverload.k b/k-distribution/tests/regression-new/checks/checkNoSymbolOverload.k
new file mode 100644
index 00000000000..b21637e84bf
--- /dev/null
+++ b/k-distribution/tests/regression-new/checks/checkNoSymbolOverload.k
@@ -0,0 +1,13 @@
+module CHECKNOSYMBOLOVERLOAD-SYNTAX
+endmodule
+
+module CHECKNOSYMBOLOVERLOAD
+ syntax LVal
+ syntax RVal
+ syntax Val ::= LVal | RVal
+ syntax Exp ::= Val
+
+ syntax RVals ::= RVal [overload(arg)]
+ syntax Vals ::= Val [overload(arg), symbol(val)]
+ syntax Exps ::= Exp [overload(arg)]
+endmodule
diff --git a/k-distribution/tests/regression-new/checks/checkNoSymbolOverload.k.out b/k-distribution/tests/regression-new/checks/checkNoSymbolOverload.k.out
new file mode 100644
index 00000000000..67615767feb
--- /dev/null
+++ b/k-distribution/tests/regression-new/checks/checkNoSymbolOverload.k.out
@@ -0,0 +1,11 @@
+[Error] Compiler: Production would not be a KORE symbol and therefore cannot be overloaded. Add a `symbol(_)` attribute to the production.
+ Source(checkNoSymbolOverload.k)
+ Location(10,20,10,40)
+ 10 | syntax RVals ::= RVal [overload(arg)]
+ . ^~~~~~~~~~~~~~~~~~~~
+[Error] Compiler: Production would not be a KORE symbol and therefore cannot be overloaded. Add a `symbol(_)` attribute to the production.
+ Source(checkNoSymbolOverload.k)
+ Location(12,20,12,40)
+ 12 | syntax Exps ::= Exp [overload(arg)]
+ . ^~~~~~~~~~~~~~~~~~~~
+[Error] Compiler: Had 2 structural errors.
diff --git a/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/Makefile b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/Makefile
new file mode 100644
index 00000000000..86158b0f8d9
--- /dev/null
+++ b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/Makefile
@@ -0,0 +1,6 @@
+DEF=test
+EXT=test
+TESTDIR=.
+KOMPILE_FLAGS=--syntax-module TEST
+
+include ../../../include/kframework/ktest.mak
diff --git a/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/exps.test b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/exps.test
new file mode 100644
index 00000000000..a9f17866dc6
--- /dev/null
+++ b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/exps.test
@@ -0,0 +1 @@
+rv(0), rv(1), rv(2), (1, 2)
diff --git a/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/exps.test.out b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/exps.test.out
new file mode 100644
index 00000000000..e735208f1ef
--- /dev/null
+++ b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/exps.test.out
@@ -0,0 +1,3 @@
+
+ exps ~> .K
+
diff --git a/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/rvals.test b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/rvals.test
new file mode 100644
index 00000000000..f5faa7fb543
--- /dev/null
+++ b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/rvals.test
@@ -0,0 +1 @@
+rv(0), rv(1), rv(2)
diff --git a/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/rvals.test.out b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/rvals.test.out
new file mode 100644
index 00000000000..929ccbc6026
--- /dev/null
+++ b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/rvals.test.out
@@ -0,0 +1,3 @@
+
+ rvals ~> .K
+
diff --git a/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/test.k b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/test.k
new file mode 100644
index 00000000000..6587cf9cc5a
--- /dev/null
+++ b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/test.k
@@ -0,0 +1,39 @@
+module TEST
+ imports DOMAINS
+
+ syntax LVal ::= lv(Int) | lv(Id)
+ syntax RVal ::= rv(Int)
+ syntax Val ::= LVal | RVal
+
+ syntax Exp ::= Int
+ | Id
+ | Val
+ | "(" Exp ")" [bracket]
+ > left:
+ Exp "," Exp [group(comma)]
+
+ syntax RVals ::= RVal [overload(arg), group(assignExp), symbol(rval), avoid]
+ | RVals "," RVal [overload(exps), group(assignExp)]
+
+ syntax Vals ::= Val [overload(arg), group(assignExp), symbol(val), avoid]
+ | Vals "," Val [overload(exps), group(assignExp)]
+
+ syntax Exps ::= Exp [overload(arg), group(assignExp), symbol(exp), avoid]
+ | Exps "," Exp [overload(exps), group(assignExp)]
+
+ syntax Exps ::= Vals
+ syntax Vals ::= RVals
+
+ syntax priority assignExp > comma
+
+ syntax KItem ::= "rvals"
+ | "vals"
+ | "exps"
+
+ configuration
+ $PGM:Exps
+
+ rule _:RVals => rvals
+ rule _:Vals => vals
+ rule _:Exps => exps [owise]
+endmodule
diff --git a/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/vals.test b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/vals.test
new file mode 100644
index 00000000000..bb34114721f
--- /dev/null
+++ b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/vals.test
@@ -0,0 +1 @@
+rv(0), lv(x), rv(2)
diff --git a/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/vals.test.out b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/vals.test.out
new file mode 100644
index 00000000000..e3ac7ad7c00
--- /dev/null
+++ b/k-distribution/tests/regression-new/issue-4142-no-symbol-overload/vals.test.out
@@ -0,0 +1,3 @@
+
+ vals ~> .K
+
diff --git a/kernel/src/main/java/org/kframework/compile/checks/CheckAtt.java b/kernel/src/main/java/org/kframework/compile/checks/CheckAtt.java
index 8000f08ea89..0bf8af0b12f 100644
--- a/kernel/src/main/java/org/kframework/compile/checks/CheckAtt.java
+++ b/kernel/src/main/java/org/kframework/compile/checks/CheckAtt.java
@@ -73,6 +73,7 @@ private void checkProduction(Production prod) {
checkSymbolKLabel(prod);
checkKLabelOverload(prod);
checkNullarySymbol(prod);
+ checkNoSymbolOverload(prod);
}
private void checkUnrecognizedAtts(T term) {
@@ -360,6 +361,15 @@ private void checkKLabelOverload(Production prod) {
}
}
+ private void checkNoSymbolOverload(Production prod) {
+ if (prod.klabel().isEmpty() && prod.att().contains(Att.OVERLOAD())) {
+ errors.add(
+ KEMException.compilerError(
+ "Production would not be a KORE symbol and therefore cannot be overloaded. Add a `symbol(_)` attribute to the production.",
+ prod));
+ }
+ }
+
private void checkNullarySymbol(Production prod) {
if (prod.att().contains(Att.SYMBOL()) && !prod.att().contains(Att.KLABEL())) {
if (prod.att().get(Att.SYMBOL()).isEmpty()) {