[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