PageRenderTime 68ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/Src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenConditionalOperatorTests.cs

https://github.com/EkardNT/Roslyn
C# | 2266 lines | 2168 code | 54 blank | 44 comment | 2 complexity | 02e500b7f2fff032c9184e2774657abe MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. // Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  2. using Microsoft.CodeAnalysis.CSharp.Symbols;
  3. using Microsoft.CodeAnalysis.CSharp.Syntax;
  4. using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
  5. using Microsoft.CodeAnalysis.Text;
  6. using Roslyn.Test.Utilities;
  7. using Xunit;
  8. namespace Microsoft.CodeAnalysis.CSharp.UnitTests.CodeGen
  9. {
  10. public class CodeGenConditionalOperatorTests : CSharpTestBase
  11. {
  12. [Fact, WorkItem(638289, "DevDiv")]
  13. public void ConditionalDelegateInterfaceUnification1()
  14. {
  15. var src =
  16. @"using System;
  17. using System.Security;
  18. [assembly: SecurityTransparent()]
  19. interface I {}
  20. class A : I {}
  21. class C : I
  22. {
  23. static Func<I> Tester(bool a)
  24. {
  25. return a
  26. ? (Func<I>)(() => new A())
  27. : () => new C();
  28. }
  29. static void Main()
  30. {
  31. System.Console.Write(Tester(false)().GetType());
  32. }
  33. }";
  34. var verify = CompileAndVerify(src,
  35. options: TestOptions.UnoptimizedExe,
  36. expectedOutput: "C");
  37. verify.VerifyIL("C.Tester", @"
  38. {
  39. // Code size 64 (0x40)
  40. .maxstack 2
  41. .locals init (System.Func<I> V_0)
  42. IL_0000: ldarg.0
  43. IL_0001: brtrue.s IL_0020
  44. IL_0003: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  45. IL_0008: dup
  46. IL_0009: brtrue.s IL_001e
  47. IL_000b: pop
  48. IL_000c: ldnull
  49. IL_000d: ldftn ""I C.<Tester>b__2(object)""
  50. IL_0013: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  51. IL_0018: dup
  52. IL_0019: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  53. IL_001e: br.s IL_003b
  54. IL_0020: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  55. IL_0025: dup
  56. IL_0026: brtrue.s IL_003b
  57. IL_0028: pop
  58. IL_0029: ldnull
  59. IL_002a: ldftn ""I C.<Tester>b__0(object)""
  60. IL_0030: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  61. IL_0035: dup
  62. IL_0036: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  63. IL_003b: stloc.0
  64. IL_003c: br.s IL_003e
  65. IL_003e: ldloc.0
  66. IL_003f: ret
  67. }
  68. ");
  69. verify = CompileAndVerify(src,
  70. expectedOutput: "C");
  71. verify.VerifyIL("C.Tester", @"
  72. {
  73. // Code size 59 (0x3b)
  74. .maxstack 2
  75. IL_0000: ldarg.0
  76. IL_0001: brtrue.s IL_001f
  77. IL_0003: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  78. IL_0008: dup
  79. IL_0009: brtrue.s IL_003a
  80. IL_000b: pop
  81. IL_000c: ldnull
  82. IL_000d: ldftn ""I C.<Tester>b__2(object)""
  83. IL_0013: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  84. IL_0018: dup
  85. IL_0019: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  86. IL_001e: ret
  87. IL_001f: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  88. IL_0024: dup
  89. IL_0025: brtrue.s IL_003a
  90. IL_0027: pop
  91. IL_0028: ldnull
  92. IL_0029: ldftn ""I C.<Tester>b__0(object)""
  93. IL_002f: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  94. IL_0034: dup
  95. IL_0035: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  96. IL_003a: ret
  97. }
  98. ");
  99. }
  100. [Fact, WorkItem(638289, "DevDiv")]
  101. public void ConditionalDelegateInterfaceUnification2()
  102. {
  103. var src =
  104. @"using System;
  105. using System.Security;
  106. [assembly: SecurityTransparent()]
  107. interface I {}
  108. class A : I {}
  109. class B : I {}
  110. class C : I
  111. {
  112. static Func<I> Tester(int a)
  113. {
  114. return a > 0
  115. ? a == 1
  116. ? (Func<I>)(() => new A())
  117. : () => new B()
  118. : (() => new C());
  119. }
  120. static void Main()
  121. {
  122. System.Console.Write(Tester(1)().GetType());
  123. }
  124. }";
  125. var verify = CompileAndVerify(src,
  126. options: TestOptions.UnoptimizedExe,
  127. expectedOutput: "A");
  128. verify.VerifyIL("C.Tester", @"
  129. {
  130. // Code size 98 (0x62)
  131. .maxstack 2
  132. .locals init (System.Func<I> V_0)
  133. IL_0000: ldarg.0
  134. IL_0001: ldc.i4.0
  135. IL_0002: bgt.s IL_0021
  136. IL_0004: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  137. IL_0009: dup
  138. IL_000a: brtrue.s IL_001f
  139. IL_000c: pop
  140. IL_000d: ldnull
  141. IL_000e: ldftn ""I C.<Tester>b__4(object)""
  142. IL_0014: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  143. IL_0019: dup
  144. IL_001a: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  145. IL_001f: br.s IL_005d
  146. IL_0021: ldarg.0
  147. IL_0022: ldc.i4.1
  148. IL_0023: beq.s IL_0042
  149. IL_0025: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  150. IL_002a: dup
  151. IL_002b: brtrue.s IL_0040
  152. IL_002d: pop
  153. IL_002e: ldnull
  154. IL_002f: ldftn ""I C.<Tester>b__2(object)""
  155. IL_0035: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  156. IL_003a: dup
  157. IL_003b: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  158. IL_0040: br.s IL_005d
  159. IL_0042: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  160. IL_0047: dup
  161. IL_0048: brtrue.s IL_005d
  162. IL_004a: pop
  163. IL_004b: ldnull
  164. IL_004c: ldftn ""I C.<Tester>b__0(object)""
  165. IL_0052: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  166. IL_0057: dup
  167. IL_0058: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  168. IL_005d: stloc.0
  169. IL_005e: br.s IL_0060
  170. IL_0060: ldloc.0
  171. IL_0061: ret
  172. }
  173. ");
  174. verify = CompileAndVerify(src,
  175. expectedOutput: "A");
  176. verify.VerifyIL("C.Tester", @"
  177. {
  178. // Code size 92 (0x5c)
  179. .maxstack 2
  180. IL_0000: ldarg.0
  181. IL_0001: ldc.i4.0
  182. IL_0002: bgt.s IL_0020
  183. IL_0004: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  184. IL_0009: dup
  185. IL_000a: brtrue.s IL_005b
  186. IL_000c: pop
  187. IL_000d: ldnull
  188. IL_000e: ldftn ""I C.<Tester>b__4(object)""
  189. IL_0014: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  190. IL_0019: dup
  191. IL_001a: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  192. IL_001f: ret
  193. IL_0020: ldarg.0
  194. IL_0021: ldc.i4.1
  195. IL_0022: beq.s IL_0040
  196. IL_0024: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  197. IL_0029: dup
  198. IL_002a: brtrue.s IL_005b
  199. IL_002c: pop
  200. IL_002d: ldnull
  201. IL_002e: ldftn ""I C.<Tester>b__2(object)""
  202. IL_0034: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  203. IL_0039: dup
  204. IL_003a: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  205. IL_003f: ret
  206. IL_0040: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  207. IL_0045: dup
  208. IL_0046: brtrue.s IL_005b
  209. IL_0048: pop
  210. IL_0049: ldnull
  211. IL_004a: ldftn ""I C.<Tester>b__0(object)""
  212. IL_0050: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  213. IL_0055: dup
  214. IL_0056: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  215. IL_005b: ret
  216. }
  217. ");
  218. }
  219. [Fact, WorkItem(638289, "DevDiv")]
  220. public void ConditionalDelegateInterfaceUnification3()
  221. {
  222. var src =
  223. @"using System;
  224. using System.Security;
  225. [assembly: SecurityTransparent()]
  226. interface I {}
  227. class A : I {}
  228. class B : I {}
  229. class C : I
  230. {
  231. static Func<I> Tester(int a)
  232. {
  233. return a > 0
  234. ? (() => new A())
  235. : a == -1
  236. ? (Func<I>)(() => new B())
  237. : (() => new C());
  238. }
  239. static void Main()
  240. {
  241. System.Console.Write(Tester(-1)().GetType());
  242. }
  243. }";
  244. var verify = CompileAndVerify(src,
  245. options: TestOptions.UnoptimizedExe,
  246. expectedOutput: "B");
  247. verify.VerifyIL("C.Tester", @"
  248. {
  249. // Code size 98 (0x62)
  250. .maxstack 2
  251. .locals init (System.Func<I> V_0)
  252. IL_0000: ldarg.0
  253. IL_0001: ldc.i4.0
  254. IL_0002: bgt.s IL_0042
  255. IL_0004: ldarg.0
  256. IL_0005: ldc.i4.m1
  257. IL_0006: beq.s IL_0025
  258. IL_0008: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  259. IL_000d: dup
  260. IL_000e: brtrue.s IL_0023
  261. IL_0010: pop
  262. IL_0011: ldnull
  263. IL_0012: ldftn ""I C.<Tester>b__4(object)""
  264. IL_0018: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  265. IL_001d: dup
  266. IL_001e: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  267. IL_0023: br.s IL_0040
  268. IL_0025: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  269. IL_002a: dup
  270. IL_002b: brtrue.s IL_0040
  271. IL_002d: pop
  272. IL_002e: ldnull
  273. IL_002f: ldftn ""I C.<Tester>b__2(object)""
  274. IL_0035: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  275. IL_003a: dup
  276. IL_003b: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  277. IL_0040: br.s IL_005d
  278. IL_0042: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  279. IL_0047: dup
  280. IL_0048: brtrue.s IL_005d
  281. IL_004a: pop
  282. IL_004b: ldnull
  283. IL_004c: ldftn ""I C.<Tester>b__0(object)""
  284. IL_0052: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  285. IL_0057: dup
  286. IL_0058: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  287. IL_005d: stloc.0
  288. IL_005e: br.s IL_0060
  289. IL_0060: ldloc.0
  290. IL_0061: ret
  291. }
  292. ");
  293. verify = CompileAndVerify(src,
  294. expectedOutput: "B");
  295. verify.VerifyIL("C.Tester", @"
  296. {
  297. // Code size 92 (0x5c)
  298. .maxstack 2
  299. IL_0000: ldarg.0
  300. IL_0001: ldc.i4.0
  301. IL_0002: bgt.s IL_0040
  302. IL_0004: ldarg.0
  303. IL_0005: ldc.i4.m1
  304. IL_0006: beq.s IL_0024
  305. IL_0008: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  306. IL_000d: dup
  307. IL_000e: brtrue.s IL_005b
  308. IL_0010: pop
  309. IL_0011: ldnull
  310. IL_0012: ldftn ""I C.<Tester>b__4(object)""
  311. IL_0018: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  312. IL_001d: dup
  313. IL_001e: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  314. IL_0023: ret
  315. IL_0024: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  316. IL_0029: dup
  317. IL_002a: brtrue.s IL_005b
  318. IL_002c: pop
  319. IL_002d: ldnull
  320. IL_002e: ldftn ""I C.<Tester>b__2(object)""
  321. IL_0034: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  322. IL_0039: dup
  323. IL_003a: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  324. IL_003f: ret
  325. IL_0040: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  326. IL_0045: dup
  327. IL_0046: brtrue.s IL_005b
  328. IL_0048: pop
  329. IL_0049: ldnull
  330. IL_004a: ldftn ""I C.<Tester>b__0(object)""
  331. IL_0050: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  332. IL_0055: dup
  333. IL_0056: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  334. IL_005b: ret
  335. }");
  336. }
  337. [Fact, WorkItem(638289, "DevDiv")]
  338. public void ConditionalDelegateInterfaceUnification4()
  339. {
  340. var src =
  341. @"using System;
  342. using System.Security;
  343. [assembly: SecurityTransparent()]
  344. interface I {}
  345. class A : I {}
  346. class B : I {}
  347. class D : I {}
  348. class C : I
  349. {
  350. static Func<I> Tester(int a)
  351. {
  352. return a > 0
  353. ? a == 1
  354. ? (Func<I>)(() => new A())
  355. : () => new B()
  356. : a == -1
  357. ? () => new C()
  358. : (Func<I>)(() => new D());
  359. }
  360. static void Main()
  361. {
  362. System.Console.Write(Tester(-2)().GetType());
  363. }
  364. }";
  365. var verify = CompileAndVerify(src,
  366. options: TestOptions.UnoptimizedExe,
  367. expectedOutput: "D");
  368. verify.VerifyIL("C.Tester", @"
  369. {
  370. // Code size 131 (0x83)
  371. .maxstack 2
  372. .locals init (System.Func<I> V_0)
  373. IL_0000: ldarg.0
  374. IL_0001: ldc.i4.0
  375. IL_0002: bgt.s IL_0042
  376. IL_0004: ldarg.0
  377. IL_0005: ldc.i4.m1
  378. IL_0006: beq.s IL_0025
  379. IL_0008: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate7""
  380. IL_000d: dup
  381. IL_000e: brtrue.s IL_0023
  382. IL_0010: pop
  383. IL_0011: ldnull
  384. IL_0012: ldftn ""I C.<Tester>b__6(object)""
  385. IL_0018: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  386. IL_001d: dup
  387. IL_001e: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate7""
  388. IL_0023: br.s IL_0040
  389. IL_0025: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  390. IL_002a: dup
  391. IL_002b: brtrue.s IL_0040
  392. IL_002d: pop
  393. IL_002e: ldnull
  394. IL_002f: ldftn ""I C.<Tester>b__4(object)""
  395. IL_0035: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  396. IL_003a: dup
  397. IL_003b: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  398. IL_0040: br.s IL_007e
  399. IL_0042: ldarg.0
  400. IL_0043: ldc.i4.1
  401. IL_0044: beq.s IL_0063
  402. IL_0046: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  403. IL_004b: dup
  404. IL_004c: brtrue.s IL_0061
  405. IL_004e: pop
  406. IL_004f: ldnull
  407. IL_0050: ldftn ""I C.<Tester>b__2(object)""
  408. IL_0056: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  409. IL_005b: dup
  410. IL_005c: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  411. IL_0061: br.s IL_007e
  412. IL_0063: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  413. IL_0068: dup
  414. IL_0069: brtrue.s IL_007e
  415. IL_006b: pop
  416. IL_006c: ldnull
  417. IL_006d: ldftn ""I C.<Tester>b__0(object)""
  418. IL_0073: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  419. IL_0078: dup
  420. IL_0079: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  421. IL_007e: stloc.0
  422. IL_007f: br.s IL_0081
  423. IL_0081: ldloc.0
  424. IL_0082: ret
  425. }
  426. ");
  427. verify = CompileAndVerify(src,
  428. expectedOutput: "D");
  429. verify.VerifyIL("C.Tester", @"
  430. {
  431. // Code size 124 (0x7c)
  432. .maxstack 2
  433. IL_0000: ldarg.0
  434. IL_0001: ldc.i4.0
  435. IL_0002: bgt.s IL_0040
  436. IL_0004: ldarg.0
  437. IL_0005: ldc.i4.m1
  438. IL_0006: beq.s IL_0024
  439. IL_0008: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate7""
  440. IL_000d: dup
  441. IL_000e: brtrue.s IL_007b
  442. IL_0010: pop
  443. IL_0011: ldnull
  444. IL_0012: ldftn ""I C.<Tester>b__6(object)""
  445. IL_0018: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  446. IL_001d: dup
  447. IL_001e: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate7""
  448. IL_0023: ret
  449. IL_0024: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  450. IL_0029: dup
  451. IL_002a: brtrue.s IL_007b
  452. IL_002c: pop
  453. IL_002d: ldnull
  454. IL_002e: ldftn ""I C.<Tester>b__4(object)""
  455. IL_0034: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  456. IL_0039: dup
  457. IL_003a: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate5""
  458. IL_003f: ret
  459. IL_0040: ldarg.0
  460. IL_0041: ldc.i4.1
  461. IL_0042: beq.s IL_0060
  462. IL_0044: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  463. IL_0049: dup
  464. IL_004a: brtrue.s IL_007b
  465. IL_004c: pop
  466. IL_004d: ldnull
  467. IL_004e: ldftn ""I C.<Tester>b__2(object)""
  468. IL_0054: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  469. IL_0059: dup
  470. IL_005a: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate3""
  471. IL_005f: ret
  472. IL_0060: ldsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  473. IL_0065: dup
  474. IL_0066: brtrue.s IL_007b
  475. IL_0068: pop
  476. IL_0069: ldnull
  477. IL_006a: ldftn ""I C.<Tester>b__0(object)""
  478. IL_0070: newobj ""System.Func<I>..ctor(object, System.IntPtr)""
  479. IL_0075: dup
  480. IL_0076: stsfld ""System.Func<I> C.CS$<>9__CachedAnonymousMethodDelegate1""
  481. IL_007b: ret
  482. }
  483. ");
  484. }
  485. [Fact(), WorkItem(638289, "DevDiv")]
  486. public void NestedConditional1()
  487. {
  488. var src =
  489. @"using System.Security;
  490. [assembly: SecurityTransparent()]
  491. public interface I {}
  492. class A : I {}
  493. class B : I {}
  494. public class C : I
  495. {
  496. static I Tester(int x, int y)
  497. {
  498. return x == 0
  499. ? (y == 0 ? (I)new A() : new B())
  500. : new C();
  501. }
  502. static void Main()
  503. {
  504. System.Console.Write(Tester(1, 0).GetType());
  505. }
  506. }";
  507. var verify = CompileAndVerify(src,
  508. options: TestOptions.UnoptimizedExe,
  509. expectedOutput: "C");
  510. verify.VerifyIL("C.Tester", @"
  511. {
  512. // Code size 36 (0x24)
  513. .maxstack 1
  514. .locals init (I V_0)
  515. IL_0000: ldarg.0
  516. IL_0001: brfalse.s IL_000c
  517. IL_0003: newobj ""C..ctor()""
  518. IL_0008: stloc.0
  519. IL_0009: ldloc.0
  520. IL_000a: br.s IL_001f
  521. IL_000c: ldarg.1
  522. IL_000d: brfalse.s IL_0018
  523. IL_000f: newobj ""B..ctor()""
  524. IL_0014: stloc.0
  525. IL_0015: ldloc.0
  526. IL_0016: br.s IL_001f
  527. IL_0018: newobj ""A..ctor()""
  528. IL_001d: stloc.0
  529. IL_001e: ldloc.0
  530. IL_001f: stloc.0
  531. IL_0020: br.s IL_0022
  532. IL_0022: ldloc.0
  533. IL_0023: ret
  534. }");
  535. // Optimized
  536. verify = CompileAndVerify(src,
  537. expectedOutput: "C");
  538. verify.VerifyIL("C.Tester", @"
  539. {
  540. // Code size 30 (0x1e)
  541. .maxstack 1
  542. .locals init (I V_0)
  543. IL_0000: ldarg.0
  544. IL_0001: brfalse.s IL_000b
  545. IL_0003: newobj ""C..ctor()""
  546. IL_0008: stloc.0
  547. IL_0009: ldloc.0
  548. IL_000a: ret
  549. IL_000b: ldarg.1
  550. IL_000c: brfalse.s IL_0016
  551. IL_000e: newobj ""B..ctor()""
  552. IL_0013: stloc.0
  553. IL_0014: ldloc.0
  554. IL_0015: ret
  555. IL_0016: newobj ""A..ctor()""
  556. IL_001b: stloc.0
  557. IL_001c: ldloc.0
  558. IL_001d: ret
  559. }");
  560. }
  561. [Fact(), WorkItem(638289, "DevDiv")]
  562. public void NestedConditional2()
  563. {
  564. var src =
  565. @"using System.Security;
  566. [assembly: SecurityTransparent()]
  567. public interface I {}
  568. class A : I {}
  569. class B : I {}
  570. public class C : I
  571. {
  572. static I Tester(int x)
  573. {
  574. return x > 0
  575. ? new C()
  576. : (x < 0 ? (I)new A() : new B());
  577. }
  578. static void Main()
  579. {
  580. System.Console.Write(Tester(0).GetType());
  581. }
  582. }";
  583. var verify = CompileAndVerify(src,
  584. options: TestOptions.UnoptimizedExe,
  585. expectedOutput: "B");
  586. verify.VerifyIL("C.Tester", @"
  587. {
  588. // Code size 38 (0x26)
  589. .maxstack 2
  590. .locals init (I V_0)
  591. IL_0000: ldarg.0
  592. IL_0001: ldc.i4.0
  593. IL_0002: bgt.s IL_001a
  594. IL_0004: ldarg.0
  595. IL_0005: ldc.i4.0
  596. IL_0006: blt.s IL_0011
  597. IL_0008: newobj ""B..ctor()""
  598. IL_000d: stloc.0
  599. IL_000e: ldloc.0
  600. IL_000f: br.s IL_0018
  601. IL_0011: newobj ""A..ctor()""
  602. IL_0016: stloc.0
  603. IL_0017: ldloc.0
  604. IL_0018: br.s IL_0021
  605. IL_001a: newobj ""C..ctor()""
  606. IL_001f: stloc.0
  607. IL_0020: ldloc.0
  608. IL_0021: stloc.0
  609. IL_0022: br.s IL_0024
  610. IL_0024: ldloc.0
  611. IL_0025: ret
  612. }");
  613. // Optimized
  614. verify = CompileAndVerify(src,
  615. expectedOutput: "B");
  616. verify.VerifyIL("C.Tester", @"
  617. {
  618. // Code size 32 (0x20)
  619. .maxstack 2
  620. .locals init (I V_0)
  621. IL_0000: ldarg.0
  622. IL_0001: ldc.i4.0
  623. IL_0002: bgt.s IL_0018
  624. IL_0004: ldarg.0
  625. IL_0005: ldc.i4.0
  626. IL_0006: blt.s IL_0010
  627. IL_0008: newobj ""B..ctor()""
  628. IL_000d: stloc.0
  629. IL_000e: ldloc.0
  630. IL_000f: ret
  631. IL_0010: newobj ""A..ctor()""
  632. IL_0015: stloc.0
  633. IL_0016: ldloc.0
  634. IL_0017: ret
  635. IL_0018: newobj ""C..ctor()""
  636. IL_001d: stloc.0
  637. IL_001e: ldloc.0
  638. IL_001f: ret
  639. }");
  640. }
  641. [Fact(), WorkItem(638289, "DevDiv")]
  642. public void NestedConditional3()
  643. {
  644. var src =
  645. @"using System.Security;
  646. [assembly: SecurityTransparent()]
  647. public interface I {}
  648. class A : I {}
  649. class B : I {}
  650. class D : I {}
  651. public class C : I
  652. {
  653. static I Tester(int x)
  654. {
  655. return x > 0
  656. ? x == 1 ? (I)new A() : new B()
  657. : x == 0 ? (I)new C() : new D();
  658. }
  659. static void Main()
  660. {
  661. System.Console.Write(Tester(1).GetType());
  662. }
  663. }";
  664. var verify = CompileAndVerify(src,
  665. options: TestOptions.UnoptimizedExe,
  666. expectedOutput: "A");
  667. verify.VerifyIL("C.Tester", @"
  668. {
  669. // Code size 50 (0x32)
  670. .maxstack 2
  671. .locals init (I V_0)
  672. IL_0000: ldarg.0
  673. IL_0001: ldc.i4.0
  674. IL_0002: bgt.s IL_0019
  675. IL_0004: ldarg.0
  676. IL_0005: brfalse.s IL_0010
  677. IL_0007: newobj ""D..ctor()""
  678. IL_000c: stloc.0
  679. IL_000d: ldloc.0
  680. IL_000e: br.s IL_0017
  681. IL_0010: newobj ""C..ctor()""
  682. IL_0015: stloc.0
  683. IL_0016: ldloc.0
  684. IL_0017: br.s IL_002d
  685. IL_0019: ldarg.0
  686. IL_001a: ldc.i4.1
  687. IL_001b: beq.s IL_0026
  688. IL_001d: newobj ""B..ctor()""
  689. IL_0022: stloc.0
  690. IL_0023: ldloc.0
  691. IL_0024: br.s IL_002d
  692. IL_0026: newobj ""A..ctor()""
  693. IL_002b: stloc.0
  694. IL_002c: ldloc.0
  695. IL_002d: stloc.0
  696. IL_002e: br.s IL_0030
  697. IL_0030: ldloc.0
  698. IL_0031: ret
  699. }");
  700. // Optimized
  701. verify = CompileAndVerify(src,
  702. expectedOutput: "A");
  703. verify.VerifyIL("C.Tester", @"
  704. {
  705. // Code size 43 (0x2b)
  706. .maxstack 2
  707. .locals init (I V_0)
  708. IL_0000: ldarg.0
  709. IL_0001: ldc.i4.0
  710. IL_0002: bgt.s IL_0017
  711. IL_0004: ldarg.0
  712. IL_0005: brfalse.s IL_000f
  713. IL_0007: newobj ""D..ctor()""
  714. IL_000c: stloc.0
  715. IL_000d: ldloc.0
  716. IL_000e: ret
  717. IL_000f: newobj ""C..ctor()""
  718. IL_0014: stloc.0
  719. IL_0015: ldloc.0
  720. IL_0016: ret
  721. IL_0017: ldarg.0
  722. IL_0018: ldc.i4.1
  723. IL_0019: beq.s IL_0023
  724. IL_001b: newobj ""B..ctor()""
  725. IL_0020: stloc.0
  726. IL_0021: ldloc.0
  727. IL_0022: ret
  728. IL_0023: newobj ""A..ctor()""
  729. IL_0028: stloc.0
  730. IL_0029: ldloc.0
  731. IL_002a: ret
  732. }");
  733. }
  734. [Fact(), WorkItem(638289, "DevDiv")]
  735. public void NestedConditional4()
  736. {
  737. var src =
  738. @"using System.Security;
  739. [assembly: SecurityTransparent()]
  740. public interface I {}
  741. class A : I {}
  742. class B : I {}
  743. class D : I {}
  744. public class C : I
  745. {
  746. static I Tester(int x)
  747. {
  748. return x > 0
  749. ? x > 1
  750. ? x > 2
  751. ? (I)new A()
  752. : new B()
  753. : new C()
  754. : new D();
  755. }
  756. static void Main()
  757. {
  758. System.Console.Write(Tester(0).GetType());
  759. }
  760. }";
  761. var verify = CompileAndVerify(src,
  762. options: TestOptions.UnoptimizedExe,
  763. expectedOutput: "D");
  764. verify.VerifyIL("C.Tester", @"
  765. {
  766. // Code size 51 (0x33)
  767. .maxstack 2
  768. .locals init (I V_0)
  769. IL_0000: ldarg.0
  770. IL_0001: ldc.i4.0
  771. IL_0002: bgt.s IL_000d
  772. IL_0004: newobj ""D..ctor()""
  773. IL_0009: stloc.0
  774. IL_000a: ldloc.0
  775. IL_000b: br.s IL_002e
  776. IL_000d: ldarg.0
  777. IL_000e: ldc.i4.1
  778. IL_000f: bgt.s IL_001a
  779. IL_0011: newobj ""C..ctor()""
  780. IL_0016: stloc.0
  781. IL_0017: ldloc.0
  782. IL_0018: br.s IL_002e
  783. IL_001a: ldarg.0
  784. IL_001b: ldc.i4.2
  785. IL_001c: bgt.s IL_0027
  786. IL_001e: newobj ""B..ctor()""
  787. IL_0023: stloc.0
  788. IL_0024: ldloc.0
  789. IL_0025: br.s IL_002e
  790. IL_0027: newobj ""A..ctor()""
  791. IL_002c: stloc.0
  792. IL_002d: ldloc.0
  793. IL_002e: stloc.0
  794. IL_002f: br.s IL_0031
  795. IL_0031: ldloc.0
  796. IL_0032: ret
  797. }");
  798. // Optimized
  799. verify = CompileAndVerify(src,
  800. expectedOutput: "D");
  801. verify.VerifyIL("C.Tester", @"
  802. {
  803. // Code size 44 (0x2c)
  804. .maxstack 2
  805. .locals init (I V_0)
  806. IL_0000: ldarg.0
  807. IL_0001: ldc.i4.0
  808. IL_0002: bgt.s IL_000c
  809. IL_0004: newobj ""D..ctor()""
  810. IL_0009: stloc.0
  811. IL_000a: ldloc.0
  812. IL_000b: ret
  813. IL_000c: ldarg.0
  814. IL_000d: ldc.i4.1
  815. IL_000e: bgt.s IL_0018
  816. IL_0010: newobj ""C..ctor()""
  817. IL_0015: stloc.0
  818. IL_0016: ldloc.0
  819. IL_0017: ret
  820. IL_0018: ldarg.0
  821. IL_0019: ldc.i4.2
  822. IL_001a: bgt.s IL_0024
  823. IL_001c: newobj ""B..ctor()""
  824. IL_0021: stloc.0
  825. IL_0022: ldloc.0
  826. IL_0023: ret
  827. IL_0024: newobj ""A..ctor()""
  828. IL_0029: stloc.0
  829. IL_002a: ldloc.0
  830. IL_002b: ret
  831. }");
  832. }
  833. [Fact]
  834. public void TestConditionalOperatorSimple()
  835. {
  836. var source = @"
  837. class C
  838. {
  839. static void Main()
  840. {
  841. bool b = true;
  842. System.Console.WriteLine(b ? 1 : 2);
  843. }
  844. }";
  845. var comp = CompileAndVerify(source, expectedOutput: "1");
  846. comp.VerifyDiagnostics();
  847. comp.VerifyIL("C.Main", @"{
  848. // Code size 13 (0xd)
  849. .maxstack 1
  850. IL_0000: ldc.i4.1
  851. IL_0001: brtrue.s IL_0006
  852. IL_0003: ldc.i4.2
  853. IL_0004: br.s IL_0007
  854. IL_0006: ldc.i4.1
  855. IL_0007: call ""void System.Console.WriteLine(int)""
  856. IL_000c: ret
  857. }");
  858. }
  859. [Fact]
  860. public void TestConditionalOperatorConstantCondition()
  861. {
  862. var source = @"
  863. class C
  864. {
  865. static void Main()
  866. {
  867. int x = 1;
  868. int y = 2;
  869. System.Console.WriteLine(true ? x : y);
  870. System.Console.WriteLine(false ? x : y);
  871. }
  872. }";
  873. var comp = CompileAndVerify(source, expectedOutput: @"
  874. 1
  875. 2");
  876. comp.VerifyDiagnostics();
  877. comp.VerifyIL("C.Main", @"{
  878. // Code size 15 (0xf)
  879. .maxstack 2
  880. .locals init (int V_0) //y
  881. IL_0000: ldc.i4.1
  882. IL_0001: ldc.i4.2
  883. IL_0002: stloc.0
  884. IL_0003: call ""void System.Console.WriteLine(int)""
  885. IL_0008: ldloc.0
  886. IL_0009: call ""void System.Console.WriteLine(int)""
  887. IL_000e: ret
  888. }");
  889. }
  890. [Fact]
  891. public void TestConditionalOperatorNullLiteral()
  892. {
  893. var source = @"
  894. class C
  895. {
  896. static void Main()
  897. {
  898. bool b = true;
  899. string s1 = b ? ""hello"" : null;
  900. System.Console.WriteLine(s1);
  901. string s2 = b ? null : ""goodbye"";
  902. System.Console.WriteLine(s2);
  903. }
  904. }";
  905. var comp = CompileAndVerify(source);
  906. comp.VerifyDiagnostics();
  907. comp.VerifyIL("C.Main", @"
  908. {
  909. // Code size 33 (0x21)
  910. .maxstack 2
  911. IL_0000: ldc.i4.1
  912. IL_0001: dup
  913. IL_0002: brtrue.s IL_0007
  914. IL_0004: ldnull
  915. IL_0005: br.s IL_000c
  916. IL_0007: ldstr ""hello""
  917. IL_000c: call ""void System.Console.WriteLine(string)""
  918. IL_0011: brtrue.s IL_001a
  919. IL_0013: ldstr ""goodbye""
  920. IL_0018: br.s IL_001b
  921. IL_001a: ldnull
  922. IL_001b: call ""void System.Console.WriteLine(string)""
  923. IL_0020: ret
  924. }");
  925. }
  926. [Fact]
  927. public void TestConditionalOperatorLambda()
  928. {
  929. var source = @"
  930. class C
  931. {
  932. static void Main()
  933. {
  934. bool b = true;
  935. System.Func<int, int> f = null;
  936. System.Console.WriteLine(f);
  937. System.Func<int, int> g1 = b ? f : x => x;
  938. System.Console.WriteLine(g1);
  939. System.Func<int, int> g2 = b ? x => x : f;
  940. System.Console.WriteLine(g2);
  941. }
  942. }";
  943. // NOTE: this is slightly different from the Dev10 IL, which caches the lambdas in static fields
  944. var comp = CompileAndVerify(source);
  945. comp.VerifyDiagnostics();
  946. comp.VerifyIL("C.Main", @"
  947. {
  948. // Code size 85 (0x55)
  949. .maxstack 3
  950. .locals init (System.Func<int, int> V_0) //f
  951. IL_0000: ldc.i4.1
  952. IL_0001: ldnull
  953. IL_0002: stloc.0
  954. IL_0003: ldloc.0
  955. IL_0004: call ""void System.Console.WriteLine(object)""
  956. IL_0009: dup
  957. IL_000a: brtrue.s IL_0029
  958. IL_000c: ldsfld ""System.Func<int, int> C.CS$<>9__CachedAnonymousMethodDelegate1""
  959. IL_0011: dup
  960. IL_0012: brtrue.s IL_002a
  961. IL_0014: pop
  962. IL_0015: ldnull
  963. IL_0016: ldftn ""int C.<Main>b__0(object, int)""
  964. IL_001c: newobj ""System.Func<int, int>..ctor(object, System.IntPtr)""
  965. IL_0021: dup
  966. IL_0022: stsfld ""System.Func<int, int> C.CS$<>9__CachedAnonymousMethodDelegate1""
  967. IL_0027: br.s IL_002a
  968. IL_0029: ldloc.0
  969. IL_002a: call ""void System.Console.WriteLine(object)""
  970. IL_002f: brtrue.s IL_0034
  971. IL_0031: ldloc.0
  972. IL_0032: br.s IL_004f
  973. IL_0034: ldsfld ""System.Func<int, int> C.CS$<>9__CachedAnonymousMethodDelegate3""
  974. IL_0039: dup
  975. IL_003a: brtrue.s IL_004f
  976. IL_003c: pop
  977. IL_003d: ldnull
  978. IL_003e: ldftn ""int C.<Main>b__2(object, int)""
  979. IL_0044: newobj ""System.Func<int, int>..ctor(object, System.IntPtr)""
  980. IL_0049: dup
  981. IL_004a: stsfld ""System.Func<int, int> C.CS$<>9__CachedAnonymousMethodDelegate3""
  982. IL_004f: call ""void System.Console.WriteLine(object)""
  983. IL_0054: ret
  984. }
  985. ");
  986. }
  987. [Fact]
  988. public void TestConditionalOperatorMethodGroup()
  989. {
  990. var source = @"
  991. class C
  992. {
  993. static void Main()
  994. {
  995. bool b = true;
  996. System.Func<int> f = null;
  997. System.Console.WriteLine(f);
  998. System.Func<int> g1 = b ? f : M;
  999. System.Console.WriteLine(g1);
  1000. System.Func<int> g2 = b ? M : f;
  1001. System.Console.WriteLine(g2);
  1002. }
  1003. static int M()
  1004. {
  1005. return 0;
  1006. }
  1007. }";
  1008. var comp = CompileAndVerify(source);
  1009. comp.VerifyDiagnostics();
  1010. comp.VerifyIL("C.Main", @"
  1011. {
  1012. // Code size 55 (0x37)
  1013. .maxstack 3
  1014. .locals init (System.Func<int> V_0) //f
  1015. IL_0000: ldc.i4.1
  1016. IL_0001: ldnull
  1017. IL_0002: stloc.0
  1018. IL_0003: ldloc.0
  1019. IL_0004: call ""void System.Console.WriteLine(object)""
  1020. IL_0009: dup
  1021. IL_000a: brtrue.s IL_001a
  1022. IL_000c: ldnull
  1023. IL_000d: ldftn ""int C.M()""
  1024. IL_0013: newobj ""System.Func<int>..ctor(object, System.IntPtr)""
  1025. IL_0018: br.s IL_001b
  1026. IL_001a: ldloc.0
  1027. IL_001b: call ""void System.Console.WriteLine(object)""
  1028. IL_0020: brtrue.s IL_0025
  1029. IL_0022: ldloc.0
  1030. IL_0023: br.s IL_0031
  1031. IL_0025: ldnull
  1032. IL_0026: ldftn ""int C.M()""
  1033. IL_002c: newobj ""System.Func<int>..ctor(object, System.IntPtr)""
  1034. IL_0031: call ""void System.Console.WriteLine(object)""
  1035. IL_0036: ret
  1036. }
  1037. ");
  1038. }
  1039. [Fact]
  1040. public void TestConditionalOperatorPreferWider()
  1041. {
  1042. var source = @"
  1043. class C
  1044. {
  1045. static void Main()
  1046. {
  1047. bool b = true;
  1048. System.Console.Write(b ? 0 : (short)1);
  1049. System.Console.Write(b ? 0 : 1u);
  1050. }
  1051. }";
  1052. // NOTE: second call is to Write(uint)
  1053. var comp = CompileAndVerify(source, expectedOutput: "00");
  1054. comp.VerifyDiagnostics();
  1055. comp.VerifyIL("C.Main", @"
  1056. {
  1057. // Code size 25 (0x19)
  1058. .maxstack 2
  1059. IL_0000: ldc.i4.1
  1060. IL_0001: dup
  1061. IL_0002: brtrue.s IL_0007
  1062. IL_0004: ldc.i4.1
  1063. IL_0005: br.s IL_0008
  1064. IL_0007: ldc.i4.0
  1065. IL_0008: call ""void System.Console.Write(int)""
  1066. IL_000d: brtrue.s IL_0012
  1067. IL_000f: ldc.i4.1
  1068. IL_0010: br.s IL_0013
  1069. IL_0012: ldc.i4.0
  1070. IL_0013: call ""void System.Console.Write(uint)""
  1071. IL_0018: ret
  1072. }");
  1073. }
  1074. /// <summary>
  1075. /// This specific code has caused problems in the past.
  1076. /// System.Security.VerificationException on the second attempt.
  1077. /// </summary>
  1078. /// <remarks>
  1079. /// No special handling seems to have been required to make this work
  1080. /// in Roslyn.
  1081. /// </remarks>
  1082. [Fact]
  1083. public void TestConditionalOperatorInterfaceRegression1()
  1084. {
  1085. var source = @"
  1086. using System;
  1087. using System.Collections.Generic;
  1088. public class Test
  1089. {
  1090. static void Main()
  1091. {
  1092. IList<Type> knownTypeList = null;
  1093. Console.Write(""first attempt: "");
  1094. object o1 = (IList<Type>)(knownTypeList == null ? new Type[0] : knownTypeList);
  1095. Console.WriteLine(o1);
  1096. Console.Write(""second attempt: "");
  1097. IList<Type> o2 = (IList<Type>)(knownTypeList == null ? new Type[0] : knownTypeList);
  1098. Console.WriteLine(o2);
  1099. }
  1100. }";
  1101. // NOTE: second call is to Write(uint)
  1102. var comp = CompileAndVerify(source, expectedOutput: @"
  1103. first attempt: System.Type[]
  1104. second attempt: System.Type[]");
  1105. comp.VerifyDiagnostics();
  1106. comp.VerifyIL("Test.Main", @"
  1107. {
  1108. // Code size 61 (0x3d)
  1109. .maxstack 1
  1110. .locals init (System.Collections.Generic.IList<System.Type> V_0, //knownTypeList
  1111. System.Collections.Generic.IList<System.Type> V_1)
  1112. IL_0000: ldnull
  1113. IL_0001: stloc.0
  1114. IL_0002: ldstr ""first attempt: ""
  1115. IL_0007: call ""void System.Console.Write(string)""
  1116. IL_000c: ldloc.0
  1117. IL_000d: brfalse.s IL_0012
  1118. IL_000f: ldloc.0
  1119. IL_0010: br.s IL_001a
  1120. IL_0012: ldc.i4.0
  1121. IL_0013: newarr ""System.Type""
  1122. IL_0018: stloc.1
  1123. IL_0019: ldloc.1
  1124. IL_001a: call ""void System.Console.WriteLine(object)""
  1125. IL_001f: ldstr ""second attempt: ""
  1126. IL_0024: call ""void System.Console.Write(string)""
  1127. IL_0029: ldloc.0
  1128. IL_002a: brfalse.s IL_002f
  1129. IL_002c: ldloc.0
  1130. IL_002d: br.s IL_0037
  1131. IL_002f: ldc.i4.0
  1132. IL_0030: newarr ""System.Type""
  1133. IL_0035: stloc.1
  1134. IL_0036: ldloc.1
  1135. IL_0037: call ""void System.Console.WriteLine(object)""
  1136. IL_003c: ret
  1137. }");
  1138. }
  1139. /// <summary>
  1140. /// From orcas bug #42645. PEVerify fails.
  1141. /// </summary>
  1142. [Fact]
  1143. public void TestConditionalOperatorInterfaceRegression2()
  1144. {
  1145. var source = @"
  1146. using System.Collections.Generic;
  1147. public class Test
  1148. {
  1149. static void Main()
  1150. {
  1151. int[] a = new int[] { };
  1152. List<int> b = new List<int>();
  1153. IEnumerable<int> c = a != null ? a : (IEnumerable<int>)b;
  1154. System.Console.WriteLine(c);
  1155. }
  1156. }";
  1157. // Note the explicit casts, even though the conversions are
  1158. // implicit reference conversions.
  1159. var comp = CompileAndVerify(source);
  1160. comp.VerifyDiagnostics();
  1161. comp.VerifyIL("Test.Main", @"
  1162. {
  1163. // Code size 30 (0x1e)
  1164. .maxstack 1
  1165. .locals init (int[] V_0, //a
  1166. System.Collections.Generic.List<int> V_1, //b
  1167. System.Collections.Generic.IEnumerable<int> V_2)
  1168. IL_0000: ldc.i4.0
  1169. IL_0001: newarr ""int""
  1170. IL_0006: stloc.0
  1171. IL_0007: newobj ""System.Collections.Generic.List<int>..ctor()""
  1172. IL_000c: stloc.1
  1173. IL_000d: ldloc.0
  1174. IL_000e: brtrue.s IL_0015
  1175. IL_0010: ldloc.1
  1176. IL_0011: stloc.2
  1177. IL_0012: ldloc.2
  1178. IL_0013: br.s IL_0018
  1179. IL_0015: ldloc.0
  1180. IL_0016: stloc.2
  1181. IL_0017: ldloc.2
  1182. IL_0018: call ""void System.Console.WriteLine(object)""
  1183. IL_001d: ret
  1184. }");
  1185. }
  1186. [Fact]
  1187. public void TestConditionalOperatorInterfaceRegression2a()
  1188. {
  1189. var source = @"
  1190. using System.Collections.Generic;
  1191. public class Test
  1192. {
  1193. static void Main()
  1194. {
  1195. int[] a = new int[] { };
  1196. List<int> b = new List<int>();
  1197. IEnumerable<int> c = a != null ? a : (IEnumerable<int>)b;
  1198. }
  1199. }";
  1200. // Note the explicit casts, even though the conversions are
  1201. // implicit reference conversions.
  1202. var comp = CompileAndVerify(source);
  1203. comp.VerifyDiagnostics();
  1204. comp.VerifyIL("Test.Main", @"
  1205. {
  1206. // Code size 16 (0x10)
  1207. .maxstack 1
  1208. .locals init (int[] V_0, //a
  1209. System.Collections.Generic.List<int> V_1) //b
  1210. IL_0000: ldc.i4.0
  1211. IL_0001: newarr ""int""
  1212. IL_0006: stloc.0
  1213. IL_0007: newobj ""System.Collections.Generic.List<int>..ctor()""
  1214. IL_000c: stloc.1
  1215. IL_000d: ldloc.0
  1216. IL_000e: pop
  1217. IL_000f: ret
  1218. }
  1219. ");
  1220. }
  1221. /// <summary>
  1222. /// From whidbey bug #108643. Extraneous class casts in Test1.m2 (vs Test1.m1).
  1223. /// </summary>
  1224. [Fact]
  1225. public void TestConditionalOperatorInterfaceRegression3()
  1226. {
  1227. var source = @"
  1228. interface Base { Base m1();}
  1229. class Driver { public static int mask = 1;}
  1230. class Test1 : Base
  1231. {
  1232. Base next;
  1233. Base same;
  1234. int cnt = 0;
  1235. public Test1(Base link)
  1236. {
  1237. same = this;
  1238. next = link;
  1239. if (next == null) next = this;
  1240. }
  1241. public Base m1() { return ((++cnt) & Driver.mask) != 0 ? same : next; } //version1 (explicit impl in original repro)
  1242. public Base m2() { return ((++cnt) & Driver.mask) != 0 ? this : next; } //version2
  1243. }";
  1244. var comp = CompileAndVerify(source);
  1245. comp.VerifyDiagnostics();
  1246. comp.VerifyIL("Test1.m1", @"
  1247. {
  1248. // Code size 39 (0x27)
  1249. .maxstack 3
  1250. .locals init (int V_0)
  1251. IL_0000: ldarg.0
  1252. IL_0001: ldarg.0
  1253. IL_0002: ldfld ""int Test1.cnt""
  1254. IL_0007: ldc.i4.1
  1255. IL_0008: add
  1256. IL_0009: stloc.0
  1257. IL_000a: ldloc.0
  1258. IL_000b: stfld ""int Test1.cnt""
  1259. IL_0010: ldloc.0
  1260. IL_0011: ldsfld ""int Driver.mask""
  1261. IL_0016: and
  1262. IL_0017: brtrue.s IL_0020
  1263. IL_0019: ldarg.0
  1264. IL_001a: ldfld ""Base Test1.next""
  1265. IL_001f: ret
  1266. IL_0020: ldarg.0
  1267. IL_0021: ldfld ""Base Test1.same""
  1268. IL_0026: ret
  1269. }");
  1270. // NOTE: no castclass
  1271. comp.VerifyIL("Test1.m2", @"
  1272. {
  1273. // Code size 36 (0x24)
  1274. .maxstack 3
  1275. .locals init (int V_0,
  1276. Base V_1)
  1277. IL_0000: ldarg.0
  1278. IL_0001: ldarg.0
  1279. IL_0002: ldfld ""int Test1.cnt""
  1280. IL_0007: ldc.i4.1
  1281. IL_0008: add
  1282. IL_0009: stloc.0
  1283. IL_000a: ldloc.0
  1284. IL_000b: stfld ""int Test1.cnt""
  1285. IL_0010: ldloc.0
  1286. IL_0011: ldsfld ""int Driver.mask""
  1287. IL_0016: and
  1288. IL_0017: brtrue.s IL_0020
  1289. IL_0019: ldarg.0
  1290. IL_001a: ldfld ""Base Test1.next""
  1291. IL_001f: ret
  1292. IL_0020: ldarg.0
  1293. IL_0021: stloc.1
  1294. IL_0022: ldloc.1
  1295. IL_0023: ret
  1296. }");
  1297. }
  1298. /// <summary>
  1299. /// From whidbey bug #49619. PEVerify fails.
  1300. /// </summary>
  1301. [Fact]
  1302. public void TestConditionalOperatorInterfaceRegression4()
  1303. {
  1304. var source = @"
  1305. public interface IA { }
  1306. public interface IB { int f(); }
  1307. public class AB1 : IA, IB { public int f() { return 42; } }
  1308. public class AB2 : IA, IB { public int f() { return 1; } }
  1309. class MainClass
  1310. {
  1311. public static void g(bool p)
  1312. {
  1313. (p ? (IB)new AB1() : (IB)new AB2()).f();
  1314. }
  1315. }";
  1316. // Note the explicit casts, even though the conversions are
  1317. // implicit reference conversions.
  1318. // CONSIDER: dev10 writes to/reads from a temp to simulate
  1319. // a static cast (instead of using castclass).
  1320. var comp = CompileAndVerify(source);
  1321. comp.VerifyDiagnostics();
  1322. comp.VerifyIL("MainClass.g", @"
  1323. {
  1324. // Code size 26 (0x1a)
  1325. .maxstack 1
  1326. .locals init (IB V_0)
  1327. IL_0000: ldarg.0
  1328. IL_0001: brtrue.s IL_000c
  1329. IL_0003: newobj ""AB2..ctor()""
  1330. IL_0008: stloc.0
  1331. IL_0009: ldloc.0
  1332. IL_000a: br.s IL_0013
  1333. IL_000c: newobj ""AB1..ctor()""
  1334. IL_0011: stloc.0
  1335. IL_0012: ldloc.0
  1336. IL_0013: callvirt ""int IB.f()""
  1337. IL_0018: pop
  1338. IL_0019: ret
  1339. }");
  1340. }
  1341. [WorkItem(9229, "DevDiv_Projects/Roslyn")]
  1342. [Fact]
  1343. public void TestConditionalOperatorForExpression()
  1344. {
  1345. var source = @"
  1346. using System.Linq;
  1347. using System.Collections.Generic;
  1348. class Program
  1349. {
  1350. static void Main(string[] args)
  1351. {
  1352. string[] arr = new string[] { ""aaa"", ""bbb"", ""ccc"" };
  1353. int[] arr_int = new int[] { 111, 222, 333 };
  1354. IEnumerable<string> s = true ? from x in arr select x : from x in arr_int select x.ToString();
  1355. foreach (var item in s)
  1356. {
  1357. System.Console.WriteLine(item);
  1358. }
  1359. }
  1360. }";
  1361. string expectedOutput = @"aaa
  1362. bbb
  1363. ccc";
  1364. CompileAndVerify(source, additionalRefs: new[] { LinqAssemblyRef }, expectedOutput: expectedOutput);
  1365. }
  1366. [Fact]
  1367. public void TestConditionalOperatorForObjInit()
  1368. {
  1369. var source = @"
  1370. using System;
  1371. class Program
  1372. {
  1373. static void Main(string[] args)
  1374. {
  1375. Foo f1 = new Foo(), f2 = new Foo(), f3 = new Foo();
  1376. bool b = true;
  1377. f3 = b ? f1 = new Foo { i = 1 } : f2 = new Foo { i = 2 };
  1378. Console.WriteLine(f1.i);
  1379. Console.WriteLine(f2.i);
  1380. Console.WriteLine(f3.i);
  1381. b = false;
  1382. f3 = b ? f1 = new Foo { i = 3 } : f2 = new Foo { i = 4 };
  1383. Console.WriteLine(f1.i);
  1384. Console.WriteLine(f2.i);
  1385. Console.WriteLine(f3.i);
  1386. }
  1387. }
  1388. class Foo
  1389. {
  1390. public int i;
  1391. }
  1392. ";
  1393. string expectedOutput = @"1
  1394. 0
  1395. 1
  1396. 1
  1397. 4
  1398. 4";
  1399. CompileAndVerify(source, expectedOutput: expectedOutput);
  1400. }
  1401. [Fact]
  1402. public void TestConditionalOperatorForObjInit_2()
  1403. {
  1404. var source = @"
  1405. using System;
  1406. class Program
  1407. {
  1408. static void Main(string[] args)
  1409. {
  1410. bool b1 = true;
  1411. bool b2 = false;
  1412. Foo f = new Foo
  1413. {
  1414. i = b1 ? 10 : -10
  1415. };
  1416. Console.WriteLine(f.i);
  1417. f = new Foo
  1418. {
  1419. i = b2 ? 10 : -10
  1420. };
  1421. Console.WriteLine(f.i);
  1422. }
  1423. }
  1424. class Foo
  1425. {
  1426. public int i;
  1427. }
  1428. ";
  1429. string expectedOutput = @"10
  1430. -10";
  1431. CompileAndVerify(source, additionalRefs: new[] { SystemCoreRef }, expectedOutput: expectedOutput);
  1432. }
  1433. [Fact]
  1434. public void TestConditionalOperatorForExpressionTree()
  1435. {
  1436. var source = @"
  1437. using System;
  1438. using System.Linq.Expressions;
  1439. class Program
  1440. {
  1441. static void Main(string[] args)
  1442. {
  1443. Expression<Func<bool, long, int, long>> testExpr = (x, y, z) => x ? y : z;
  1444. var testFunc = testExpr.Compile();
  1445. Console.WriteLine(testFunc(false, (long)3, 100)); //100
  1446. }
  1447. }
  1448. ";
  1449. string expectedOutput = @"100";
  1450. CompileAndVerify(source, additionalRefs: new [] { SystemCoreRef }, expectedOutput: expectedOutput);
  1451. }
  1452. [Fact]
  1453. public void TestConditionalOperatorForCustomOperator()
  1454. {
  1455. var source = @"
  1456. using System;
  1457. using System.Linq.Expressions;
  1458. class Program
  1459. {
  1460. static void Main(string[] args)
  1461. {
  1462. Expression<Func<TestStruct, int?, int, int?>> testExpr = (x, y, z) => x ? y : z;
  1463. var testFunc = testExpr.Compile();
  1464. Console.WriteLine(testFunc(new TestStruct(), (int?)null, 10)); //10
  1465. }
  1466. }
  1467. public struct TestStruct
  1468. {
  1469. public static bool operator true(TestStruct ts)
  1470. {
  1471. return false;
  1472. }
  1473. public static bool operator false(TestStruct ts)
  1474. {
  1475. return true;
  1476. }
  1477. }
  1478. ";
  1479. string expectedOutput = @"10";
  1480. CompileAndVerify(source, additionalRefs: new [] { SystemCoreRef }, expectedOutput: expectedOutput);
  1481. }
  1482. [Fact]
  1483. public void TestConditionalOperatorForMultiCondition()
  1484. {
  1485. var source = @"
  1486. class Program
  1487. {
  1488. static void Main(string[] args)
  1489. {
  1490. System.Console.WriteLine(false ? 1 : true ? 2 : 3);
  1491. }
  1492. }
  1493. ";
  1494. string expectedOutput = @"2";
  1495. string expectedIL = @"{
  1496. // Code size 7 (0x7)
  1497. .maxstack 1
  1498. IL_0000: ldc.i4.2
  1499. IL_0001: call ""void System.Console.WriteLine(int)""
  1500. IL_0006: ret
  1501. }";
  1502. CompileAndVerify(source, expectedOutput: expectedOutput).VerifyIL("Program.Main", expectedIL);
  1503. }
  1504. [WorkItem(528275, "DevDiv")]
  1505. [Fact]
  1506. public void TestConditionalOperatorForImplicitConv()
  1507. {
  1508. var source = @"
  1509. using System.Linq;
  1510. class Program
  1511. {
  1512. static void Main(string[] args)
  1513. {
  1514. System.Console.WriteLine(false ? Enumerable.Empty<int>() : new int[] { 1 });
  1515. }
  1516. }
  1517. ";
  1518. string expectedOutput = @"System.Int32[]";
  1519. string expectedIL = @"{
  1520. // Code size 16 (0x10)
  1521. .maxstack 4
  1522. IL_0000: ldc.i4.1
  1523. IL_0001: newarr ""int""
  1524. IL_0006: dup
  1525. IL_0007: ldc.i4.0
  1526. IL_0008: ldc.i4.1
  1527. IL_0009: stelem.i4
  1528. IL_000a: call ""void System.Console.WriteLine(object)""
  1529. IL_000f: ret
  1530. }";
  1531. MetadataReference[] metadataRef = new[] { LinqAssemblyRef };
  1532. // Dev11 compiler reports WRN_UnreachableExpr, but reachability is defined for statements not for expressions.
  1533. // We don't report the warning.
  1534. CompileAndVerify(source, additionalRefs: metadataRef, expectedOutput: expectedOutput).VerifyIL("Program.Main", expectedIL).VerifyDiagnostics();
  1535. }
  1536. [Fact]
  1537. public void TestConditionalOperatorForConversion()
  1538. {
  1539. var source = @"
  1540. using System;
  1541. class Program
  1542. {
  1543. static void Main(string[] args)
  1544. {
  1545. object valueFromDatabase;
  1546. decimal result;
  1547. valueFromDatabase = DBNull.Value;
  1548. result = (valueFromDatabase != DBNull.Value ? (decimal)valueFromDatabase : (decimal)0);
  1549. System.Console.WriteLine(result);
  1550. result = (decimal)(valueFromDatabase != DBNull.Value ? valueFromDatabase : 0); //Runtime exception
  1551. System.Console.WriteLine(result);
  1552. }
  1553. }
  1554. ";
  1555. string expectedIL = @"
  1556. {
  1557. // Code size 60 (0x3c)
  1558. .maxstack 2
  1559. .locals init (object V_0) //valueFromDatabase
  1560. IL_0000: ldsfld ""System.DBNull System.DBNull.Value""
  1561. IL_0005: stloc.0
  1562. IL_0006: ldloc.0
  1563. IL_0007: ldsfld ""System.DBNull System.DBNull.Value""
  1564. IL_000c: bne.un.s IL_0015
  1565. IL_000e: ldsfld ""decimal decimal.Zero""
  1566. IL_0013: br.s IL_001b
  1567. IL_0015: ldloc.0
  1568. IL_0016: unbox.any ""decimal""
  1569. IL_001b: call ""void System.Console.WriteLine(decimal)""
  1570. IL_0020: ldloc.0
  1571. IL_0021: ldsfld ""System.DBNull System.DBNull.Value""
  1572. IL_0026: bne.un.s IL_0030
  1573. IL_0028: ldc.i4.0
  1574. IL_0029: box ""int""
  1575. IL_002e: br.s IL_0031
  1576. IL_0030: ldloc.0
  1577. IL_0031: unbox.any ""decimal""
  1578. IL_0036: call ""void System.Console.WriteLine(decimal)""
  1579. IL_003b: ret
  1580. }";
  1581. CompileAndVerify(source, additionalRefs: new[] { SystemCoreRef }).VerifyIL("Program.Main", expectedIL);
  1582. }
  1583. [Fact, WorkItem(530071, "DevDiv")]
  1584. public void TestConditionalOperatorForImplicitlyTypedArrays()
  1585. {
  1586. var source = @"
  1587. using System;
  1588. class Program
  1589. {
  1590. static void Main(string[] args)
  1591. {
  1592. int[] a, a1, a2;
  1593. a = a1 = a2 = null;
  1594. a = true ? a1 = new[] { 1, 2, 3 } : a2 = new[] { 4, 5, 6 };
  1595. foreach (int item in a1)
  1596. { Console.WriteLine(item); }
  1597. }
  1598. }
  1599. ";
  1600. string expectedOutput = @"1
  1601. 2
  1602. 3";
  1603. // Dev11 compiler reports WRN_UnreachableExpr, but reachability is defined for statements not for expressions.
  1604. // We don't report the warning.
  1605. CompileAndVerify(source, additionalRefs: new[] { SystemCoreRef }, expectedOutput: expectedOutput).
  1606. VerifyDiagnostics();
  1607. }
  1608. [Fact]
  1609. public void TestConditionalOperatorForConst()
  1610. {
  1611. var source = @"
  1612. class Program
  1613. {
  1614. const bool con = true;
  1615. static int Main(string[] args)
  1616. {
  1617. int s1 = con != true ? 1 : 2;
  1618. return s1;
  1619. }
  1620. }
  1621. ";
  1622. string expectedIL = @"{
  1623. // Code size 2 (0x2)
  1624. .maxstack 1
  1625. IL_0000: ldc.i4.2
  1626. IL_0001: ret
  1627. }";
  1628. CompileAndVerify(source).VerifyIL("Program.Main", expectedIL);
  1629. }
  1630. [Fact]
  1631. public void TestConditionalOperatorForStatic()
  1632. {
  1633. var source = @"
  1634. class Program
  1635. {
  1636. static bool con = true;
  1637. static int Main(string[] args)
  1638. {
  1639. int s1 = con != true ? 1 : 2;
  1640. return s1;
  1641. }
  1642. }
  1643. ";
  1644. string expectedIL = @"{
  1645. // Code size 11 (0xb)
  1646. .maxstack 1
  1647. IL_0000: ldsfld ""bool Program.con""
  1648. IL_0005: brfalse.s IL_0009
  1649. IL_0007: ldc.i4.2
  1650. IL_0008: ret
  1651. IL_0009: ldc.i4.1
  1652. IL_000a: ret
  1653. }";
  1654. CompileAndVerify(source).VerifyIL("Program.Main", expectedIL);
  1655. }
  1656. [Fact]
  1657. public void TestConditionalOperatorForGenericMethod()
  1658. {
  1659. var source = @"
  1660. class Program
  1661. {
  1662. static void Main(string[] args)
  1663. {
  1664. int x = 1;
  1665. object y = 0;
  1666. System.Console.WriteLine(true ? fun(x) : fun(y));
  1667. }
  1668. private static T fun<T>(T t)
  1669. {
  1670. return t;
  1671. }
  1672. }
  1673. ";
  1674. string expectedOutput = @"1";
  1675. string expectedIL = @"{
  1676. // Code size 17 (0x11)
  1677. .maxstack 1
  1678. IL_0000: ldc.i4.1
  1679. IL_0001: call ""int Program.fun<int>(int)""
  1680. IL_0006: box ""int""
  1681. IL_000b: call ""void System.Console.WriteLine(object)""
  1682. IL_0010: ret
  1683. }";
  1684. CompileAndVerify(source, expectedOutput: expectedOutput).VerifyIL("Program.Main", expectedIL);
  1685. }
  1686. [Fact]
  1687. public void TestConditionalOperatorForGenericMethod2()
  1688. {
  1689. var source = @"
  1690. class Program
  1691. {
  1692. static void Main(string[] args)
  1693. {
  1694. int x = 1;
  1695. object y = 0;
  1696. System.Console.WriteLine(y != null ? fun(x) : fun(y));
  1697. }
  1698. private static T fun<T>(T t)
  1699. {
  1700. return t;
  1701. }
  1702. }
  1703. ";
  1704. string expectedOutput = @"1";
  1705. string expectedIL = @"
  1706. {
  1707. // Code size 37 (0x25)
  1708. .maxstack 1
  1709. .locals init (int V_0, //x
  1710. object V_1) //y
  1711. IL_0000: ldc.i4.1
  1712. IL_0001: stloc.0
  1713. IL_0002: ldc.i4.0
  1714. IL_0003: box ""int""
  1715. IL_0008: stloc.1
  1716. IL_0009: ldloc.1
  1717. IL_000a: brtrue.s IL_0014
  1718. IL_000c: ldloc.1
  1719. IL_000d: call ""object Program.fun<object>(object)""
  1720. IL_0012: br.s IL_001f
  1721. IL_0014: ldloc.0
  1722. IL_0015: call ""int Program.fun<int>(int)""
  1723. IL_001a: box ""int""
  1724. IL_001f: call ""void System.Console.WriteLine(object)""
  1725. IL_0024: ret
  1726. }
  1727. ";
  1728. CompileAndVerify(source, expectedOutput: expectedOutput).VerifyIL("Program.Main", expectedIL);
  1729. }
  1730. [Fact]
  1731. public void TestConditionalOperatorForParenthesizedExpression()
  1732. {
  1733. var source = @"
  1734. class Program
  1735. {
  1736. static void Main(string[] args)
  1737. {
  1738. int x = 1;
  1739. int y = 1;
  1740. System.Console.WriteLine(((x == y)) ? (++x) : ((((++y))))); // OK
  1741. }
  1742. }
  1743. ";
  1744. string expectedOutput = @"2";
  1745. CompileAndVerify(source, expectedOutput: expectedOutput);
  1746. }
  1747. [Fact]
  1748. public void TestConditionalOpera

Large files files are truncated, but you can click here to view the full file