14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 %s -triple %itanium_abi_triple -std=c++11 -emit-llvm -o - | FileCheck %s 24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Test optnone on template instantiations. 44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//-- Effect of optnone on generic add template function. 64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T> T template_normal(T a) 84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{ 94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return a + a; 104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T> __attribute__((optnone)) T template_optnone(T a) 134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{ 144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return a + a + a; 154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This function should cause instantiations of each template, one marked 184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// with the 'optnone' attribute. 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint container(int i) 204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{ 214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return template_normal<int>(i) + template_optnone<int>(i); 224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: @_Z15template_normalIiET_S0_({{.*}}) [[NORMAL:#[0-9]+]] 254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: @_Z16template_optnoneIiET_S0_({{.*}}) [[OPTNONE:#[0-9]+]] 264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//-- Effect of optnone on a partial specialization. 294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// FIRST TEST: a method becomes marked with optnone in the specialization. 304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T, typename U> class template_normal_base { 324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar T method(T t, U u) 344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar { 354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return t + static_cast<T>(u); 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename U> class template_normal_base<int, U> 404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{ 414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar __attribute__((optnone)) int method (int t, U u) 434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar { 444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return t - static_cast<int>(u); 454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This function should cause an instantiation of the full template (whose 494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// method is not marked optnone) and an instantiation of the partially 504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// specialized template (whose method is marked optnone). 514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid container2() 524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{ 534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int y = 2; 544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar float z = 3.0; 554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template_normal_base<float, int> class_normal; 564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template_normal_base<int, float> class_optnone; 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar float r1 = class_normal.method(z, y); 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar float r2 = class_optnone.method(y, z); 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: @_ZN20template_normal_baseIfiE6methodEfi({{.*}}) [[NORMAL]] 624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: @_ZN20template_normal_baseIifE6methodEif({{.*}}) [[OPTNONE]] 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//-- Effect of optnone on a partial specialization. 664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// SECOND TEST: a method loses optnone in the specialization. 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T, typename U> class template_optnone_base { 694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar __attribute__((optnone)) T method(T t, U u) 714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar { 724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return t + static_cast<T>(u); 734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename U> class template_optnone_base<int, U> 774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{ 784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int method (int t, U u) 804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar { 814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return t - static_cast<int>(u); 824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This function should cause an instantiation of the full template (whose 864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// method is marked optnone) and an instantiation of the partially 874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// specialized template (whose method is not marked optnone). 884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid container3() 894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{ 904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar int y = 2; 914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar float z = 3.0; 924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template_optnone_base<float, int> class_optnone; 934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template_optnone_base<int, float> class_normal; 944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar float r1 = class_optnone.method(z, y); 954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar float r2 = class_normal.method(y, z); 964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: @_ZN21template_optnone_baseIfiE6methodEfi({{.*}}) [[OPTNONE]] 994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: @_ZN21template_optnone_baseIifE6methodEif({{.*}}) [[NORMAL]] 1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: attributes [[NORMAL]] = 1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NOT: optnone 1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: attributes [[OPTNONE]] = {{.*}} optnone 105