{"shas":[["40048f7fb15797aa00f44a746b7c84f4cb1c2588","d279088d79e357a153f8842902bcfc9d630ff5da@91177308-0d34-0410-b5e6-96231b3b80d8","Create a new expression node, SubstNonTypeTemplateParmExpr,\nto represent a fully-substituted non-type template parameter.\nThis should improve source fidelity, as well as being generically\nuseful for diagnostics and such.\n\n\n\ngit-svn-id: http://llvm.org/svn/llvm-project/cfe/trunk@135243 91177308-0d34-0410-b5e6-96231b3b80d8","rjmccall"],["1f85574bec2890dcd3e42e32027f0b0d23a3f7de","dc0c83763d96e040f193b50480a63873ecedb8fe@91177308-0d34-0410-b5e6-96231b3b80d8","Enhance the IR type lowering code to be much smarter about recursively lowering\ntypes.  Fore xample, we used to lower:\n\nstruct bar { int a; };\nstruct foo {\n void (*FP)(struct bar);\n} G;\n\nto:\n\n%struct.foo = type { {}* }\n\nsince the function pointer would cause recursive translation of bar and\nwe didn't know if that would get us into trouble.  We are now smart enough\nto know that it is fine, so we get this type instead:\n\n%struct.foo = type { void (i32)* }\n\nCodegen still needs to be prepared for uncooperative types at any place,\nwhich is why I let the maximally uncooperative code sit around for awhile to\nhelp shake out the bugs.\n\n\n\ngit-svn-id: http://llvm.org/svn/llvm-project/cfe/trunk@135244 91177308-0d34-0410-b5e6-96231b3b80d8","lattner"]],"ref":"refs/heads/trunk","size":2,"head":"1f85574bec2890dcd3e42e32027f0b0d23a3f7de","push_id":36681156}