[vala/staging] vala: Do not allow to implement the same interface multiple times
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/staging] vala: Do not allow to implement the same interface multiple times
- Date: Thu, 17 May 2018 15:02:03 +0000 (UTC)
commit 96d9d891ffb27e25595374c97932cdbd66aae4bf
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Thu May 17 16:57:23 2018 +0200
vala: Do not allow to implement the same interface multiple times
Based on patch by Florian Brosch
https://bugzilla.gnome.org/show_bug.cgi?id=656204
tests/Makefile.am | 1 +
tests/objects/bug656204-1.test | 10 ++++++++++
vala/valaclass.vala | 9 +++++++++
3 files changed, 20 insertions(+), 0 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4391d2f..7274d83 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -282,6 +282,7 @@ TESTS = \
objects/bug653138.vala \
objects/bug654702.vala \
objects/bug656204.vala \
+ objects/bug656204-1.test \
objects/bug663134.vala \
objects/bug664529.vala \
objects/bug667668.vala \
diff --git a/tests/objects/bug656204-1.test b/tests/objects/bug656204-1.test
new file mode 100644
index 0000000..0ff8bb9
--- /dev/null
+++ b/tests/objects/bug656204-1.test
@@ -0,0 +1,10 @@
+Invalid Code
+
+interface Foo {
+}
+
+class Bar : Foo, Foo {
+}
+
+void main () {
+}
diff --git a/vala/valaclass.vala b/vala/valaclass.vala
index d9edda5..033d581 100644
--- a/vala/valaclass.vala
+++ b/vala/valaclass.vala
@@ -464,12 +464,21 @@ public class Vala.Class : ObjectTypeSymbol {
// Organize base-types based on their relationship
base_types.sort (cmp_base_types);
+ unowned Interface? last_iface = null;
foreach (DataType base_type_reference in get_base_types ()) {
if (!base_type_reference.check (context)) {
error = true;
return false;
}
+ unowned Interface? iface = base_type_reference.data_type as Interface;
+ if (iface != null && last_iface == iface) {
+ Report.error (source_reference, "class `%s' already implements interface
`%s'".printf (get_full_name (), iface.get_full_name ()));
+ error = true;
+ return false;
+ }
+ last_iface = iface;
+
if (!(base_type_reference is ObjectType)) {
error = true;
Report.error (source_reference, "base type `%s` of class `%s` is not an
object type".printf (base_type_reference.to_string (), get_full_name ()));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]