diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/.gitignore b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/.gitignore
new file mode 100644
index 0000000000..afce51184c
--- /dev/null
+++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/.gitignore
@@ -0,0 +1,2 @@
+/.aadlbin-gen/
+/instances/
diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/.project b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/.project
new file mode 100644
index 0000000000..d9498e9c01
--- /dev/null
+++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/.project
@@ -0,0 +1,18 @@
+
+
+ issue2743
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
+
+
+ org.osate.core.aadlnature
+ org.eclipse.xtext.ui.shared.xtextNature
+
+
diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/ErrorTypes.aadl b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/ErrorTypes.aadl
new file mode 100644
index 0000000000..5f18607dc2
--- /dev/null
+++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/ErrorTypes.aadl
@@ -0,0 +1,14 @@
+package ErrorTypes
+public
+ annex EMV2 {**
+ error types
+ ServiceError: type;
+ TimingError: type;
+ ValueError: type;
+ ServiceSet: type set {ServiceError};
+ TimingSet: type set {TimingError};
+ ValueSet: type set {ValueError};
+ TimingAlias renames type set TimingSet;
+ end types;
+ **};
+end ErrorTypes;
diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/Issue2743.aadl b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/Issue2743.aadl
new file mode 100644
index 0000000000..8935f0bb92
--- /dev/null
+++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/Issue2743.aadl
@@ -0,0 +1,21 @@
+package Issue2743
+public
+ system s
+ features
+ first: out feature;
+ middle: out feature;
+ last: out feature;
+ multiple: out feature;
+ qualified: out feature;
+ annex EMV2 {**
+ use types ErrorTypes;
+ error propagations
+ first: out propagation {ServiceSet * TimingError};
+ middle: out propagation {ServiceError * TimingSet * ValueError};
+ last: out propagation {ServiceError * TimingError * ValueSet};
+ multiple: out propagation {ServiceSet * TimingSet * ValueSet};
+ qualified: out propagation {ServiceError * ErrorTypes::TimingAlias};
+ end propagations;
+ **};
+ end s;
+end Issue2743;
diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/ValidTypeProducts.aadl b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/ValidTypeProducts.aadl
new file mode 100644
index 0000000000..a087c26ce2
--- /dev/null
+++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2743/ValidTypeProducts.aadl
@@ -0,0 +1,21 @@
+package ValidTypeProducts
+public
+ system s
+ features
+ product: out feature;
+ single_type: out feature;
+ single_set: out feature;
+ alias_set: out feature;
+ union_sets: out feature;
+ annex EMV2 {**
+ use types ErrorTypes;
+ error propagations
+ product: out propagation {ServiceError * TimingError * ValueError};
+ single_type: out propagation {ServiceError};
+ single_set: out propagation {ServiceSet};
+ alias_set: out propagation {ErrorTypes::TimingAlias};
+ union_sets: out propagation {ServiceSet, TimingSet, ValueSet};
+ end propagations;
+ **};
+ end s;
+end ValidTypeProducts;
diff --git a/emv2/org.osate.aadl2.errormodel.tests/src/org/osate/aadl2/errormodel/tests/issues/Issue2743Test.java b/emv2/org.osate.aadl2.errormodel.tests/src/org/osate/aadl2/errormodel/tests/issues/Issue2743Test.java
new file mode 100644
index 0000000000..63c1f5670c
--- /dev/null
+++ b/emv2/org.osate.aadl2.errormodel.tests/src/org/osate/aadl2/errormodel/tests/issues/Issue2743Test.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2004-2026 Carnegie Mellon University and others. (see Contributors file).
+ * All Rights Reserved.
+ *
+ * NO WARRANTY. ALL MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY
+ * KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE
+ * OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT
+ * MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.
+ *
+ * This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Created, in part, with funding and support from the United States Government. (see Acknowledgments file).
+ *
+ * This program includes and/or can make use of certain third party source code, object code, documentation and other
+ * files ("Third Party Software"). The Third Party Software that is used by this program is dependent upon your system
+ * configuration. By using this program, You agree to comply with any and all relevant Third Party Software terms and
+ * conditions contained in any such Third Party Software or separate license file distributed with this program. The
+ * parties who own the Third Party Software ("Third Party Licensors") are intended third party beneficiaries to this
+ * license with respect to the terms applicable to their Third Party Software. Third Party Software licenses only apply
+ * to the Third Party Software and not any other portion of this program or this program as a whole.
+ */
+package org.osate.aadl2.errormodel.tests.issues;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.xtext.diagnostics.Severity;
+import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
+import org.eclipse.xtext.testing.InjectWith;
+import org.eclipse.xtext.testing.XtextRunner;
+import org.eclipse.xtext.testing.validation.ValidationTestHelper;
+import org.eclipse.xtext.validation.Issue;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.osate.aadl2.AadlPackage;
+import org.osate.aadl2.errormodel.tests.ErrorModelInjectorProvider;
+import org.osate.testsupport.TestHelper;
+
+import com.google.inject.Inject;
+import com.itemis.xtext.testing.XtextTest;
+
+@RunWith(XtextRunner.class)
+@InjectWith(ErrorModelInjectorProvider.class)
+public class Issue2743Test extends XtextTest {
+ private static final String PROJECT_LOCATION = "org.osate.aadl2.errormodel.tests/models/issue2743/";
+
+ @Inject
+ private TestHelper testHelper;
+
+ @Inject
+ private ValidationTestHelper validation;
+
+ @Test
+ public void reportsEveryTypeSetReferenceInTypeProducts() {
+ var library = testHelper.parseFile(PROJECT_LOCATION + "ErrorTypes.aadl");
+ validation.assertNoIssues(library);
+ var pkg = testHelper.parseFile(PROJECT_LOCATION + "Issue2743.aadl", PROJECT_LOCATION + "ErrorTypes.aadl");
+ assertTrue(pkg.eResource().getErrors().toString(), pkg.eResource().getErrors().isEmpty());
+ var diagnostics = validation.validate(pkg).stream().sorted(Comparator.comparing(Issue::getOffset)).toList();
+ assertEquals(diagnostics.toString(), 7, diagnostics.size());
+
+ var source = NodeModelUtils.getNode(pkg).getRootNode().getText();
+ var references = List.of("ServiceSet", "TimingSet", "ValueSet", "ServiceSet", "TimingSet", "ValueSet",
+ "ErrorTypes::TimingAlias");
+ for (int i = 0; i < references.size(); i++) {
+ var diagnostic = diagnostics.get(i);
+ var reference = references.get(i);
+ assertEquals(Severity.ERROR, diagnostic.getSeverity());
+ assertEquals(reference, source.substring(diagnostic.getOffset(),
+ diagnostic.getOffset() + diagnostic.getLength()));
+ var name = reference.substring(reference.lastIndexOf(':') + 1);
+ assertEquals("Type product contains type set " + name, diagnostic.getMessage());
+ }
+ }
+
+ @Test
+ public void acceptsErrorTypeProductsAndStandaloneTypeSets() {
+ var library = testHelper.parseFile(PROJECT_LOCATION + "ErrorTypes.aadl");
+ validation.assertNoIssues(library);
+ var pkg = testHelper.parseFile(PROJECT_LOCATION + "ValidTypeProducts.aadl",
+ PROJECT_LOCATION + "ErrorTypes.aadl");
+ validation.assertNoIssues(pkg);
+ }
+}
diff --git a/emv2/org.osate.xtext.aadl2.errormodel/src/org/osate/xtext/aadl2/errormodel/validation/ErrorModelValidator.java b/emv2/org.osate.xtext.aadl2.errormodel/src/org/osate/xtext/aadl2/errormodel/validation/ErrorModelValidator.java
index 821454b3d5..e94e3f8ed4 100644
--- a/emv2/org.osate.xtext.aadl2.errormodel/src/org/osate/xtext/aadl2/errormodel/validation/ErrorModelValidator.java
+++ b/emv2/org.osate.xtext.aadl2.errormodel/src/org/osate/xtext/aadl2/errormodel/validation/ErrorModelValidator.java
@@ -716,9 +716,11 @@ private ErrorType sameRoot(Collection matchTypes, ErrorType et) {
private void checkTypeTokenSingleTypeSet(TypeToken ts) {
EList ets = ts.getType();
if (ets.size() > 1) {
- ErrorTypes first = ets.get(0);
- if (first instanceof TypeSet) {
- error(ts, "Type product contains type set " + first.getName());
+ for (int i = 0; i < ets.size(); i++) {
+ if (ets.get(i) instanceof TypeSet typeSet) {
+ error("Type product contains type set " + typeSet.getName(), ts,
+ ErrorModelPackage.Literals.TYPE_TOKEN__TYPE, i, null);
+ }
}
}
}