[Mono-bugs] [Bug 81392][Nor] New - Generic constraints not compiled correctly
bugzilla-daemon at bugzilla.ximian.com
bugzilla-daemon at bugzilla.ximian.com
Wed Apr 18 03:35:47 EDT 2007
Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.
Changed by alp at atoker.com.
http://bugzilla.ximian.com/show_bug.cgi?id=81392
--- shadow/81392 2007-04-18 03:35:47.000000000 -0400
+++ shadow/81392.tmp.13445 2007-04-18 03:35:47.000000000 -0400
@@ -0,0 +1,92 @@
+Bug#: 81392
+Product: Mono: Compilers
+Version: unspecified
+OS: All
+OS Details:
+Status: NEW
+Resolution:
+Severity:
+Priority: Normal
+Component: C#
+AssignedTo: rharinath at novell.com
+ReportedBy: alp at atoker.com
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: Generic constraints not compiled correctly
+
+With this test case:
+
+using System;
+using System.Reflection;
+
+class foo
+{
+ public static int GenericCompare<T> (Nullable<T> left, Nullable<T> right)
+where T: struct
+ {
+ return 0;
+ }
+
+ public static void Main ()
+ {
+ MethodInfo mi = typeof (foo).GetMethod ("GenericCompare");
+ Console.WriteLine (mi.Name);
+
+ //MethodInfo mi = method as MethodInfo;
+ Type [] genArgs = mi == null ? Type.EmptyTypes :
+ mi.GetGenericArguments ();
+ if (genArgs.Length > 0) {
+ string [] genArgNames = new string [genArgs.Length];
+ for (int i = 0; i < genArgs.Length; i++) {
+ genArgNames [i] = genArgs [i].Name;
+ string genArgCsts = String.Empty;
+ Console.WriteLine ("genArgs [i]: " + genArgs [i]);
+ Type [] gcs = genArgs [i].GetGenericParameterConstraints ();
+ Console.WriteLine ("gcs.Length: " + gcs.Length);
+ if (gcs.Length > 0) {
+ string [] gcNames = new string [gcs.Length];
+ for (int g = 0; g < gcs.Length; g++)
+ gcNames [g] = gcs [g].FullName;
+ genArgCsts = String.Concat (
+ "(",
+ string.Join (", ", gcNames),
+ ") ",
+ genArgNames [i]);
+ }
+ else
+ genArgCsts = genArgNames [i];
+ if ((genArgs [i].GenericParameterAttributes &
+GenericParameterAttributes.ReferenceTypeConstraint) != 0)
+ genArgCsts = "class " + genArgCsts;
+ else if ((genArgs [i].GenericParameterAttributes &
+GenericParameterAttributes.NotNullableValueTypeConstraint) != 0)
+ genArgCsts = "struct " + genArgCsts;
+ genArgNames [i] = genArgCsts;
+ }
+ string ret = String.Format ("{0}<{2}>({1})",
+ "name",
+ "parms",
+ string.Join (",", genArgNames));
+
+ Console.WriteLine (ret);
+ }
+ }
+}
+
+
+When compiled with gmcs, the output on both Mono and MS .NET is:
+
+GenericCompare
+genArgs [i]: T
+gcs.Length: 0
+name<struct T>(parms)
+
+
+When compiled with csc, the output on MS .NET is:
+
+GenericCompare
+genArgs [i]: T
+gcs.Length: 1
+name<struct (System.ValueType) T>(parms)
More information about the mono-bugs
mailing list