1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ast-print %s | FileCheck %s 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -emit-pch -o %t %s 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fopenmp=libiomp5 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print 4c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// expected-no-diagnostics 5c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev 64fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#ifndef HEADER 74fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#define HEADER 84fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev 9c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataevstruct St{ 10c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev int a; 11c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev}; 12c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev 13c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataevstruct St1{ 14c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev int a; 15c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev static int b; 16c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// CHECK: static int b; 17c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#pragma omp threadprivate(b) 18d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataev// CHECK-NEXT: #pragma omp threadprivate(St1::b) 19c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev} d; 20c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev 21c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataevint a, b; 22c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// CHECK: int a; 23c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// CHECK: int b; 24c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#pragma omp threadprivate(a) 2533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#pragma omp threadprivate(a) 2633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK-NEXT: #pragma omp threadprivate(a) 27c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// CHECK-NEXT: #pragma omp threadprivate(a) 28c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#pragma omp threadprivate(d, b) 29c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// CHECK-NEXT: #pragma omp threadprivate(d,b) 30c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <class T> 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct ST { 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static T m; 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines #pragma omp threadprivate(m) 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 37c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataevtemplate <class T> T foo() { 38c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev static T v; 39c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev #pragma omp threadprivate(v) 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines v = ST<T>::m; 41c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev return v; 42c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev} 43c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//CHECK: template <class T = int> int foo() { 44c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//CHECK-NEXT: static int v; 45c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//CHECK-NEXT: #pragma omp threadprivate(v) 46c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//CHECK: template <class T> T foo() { 47c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//CHECK-NEXT: static T v; 48c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//CHECK-NEXT: #pragma omp threadprivate(v) 49c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev 50d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataevnamespace ns{ 51d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataev int a; 52d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataev} 53d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataev// CHECK: namespace ns { 54d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataev// CHECK-NEXT: int a; 55d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataev// CHECK-NEXT: } 56d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataev#pragma omp threadprivate(ns::a) 57d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataev// CHECK-NEXT: #pragma omp threadprivate(ns::a) 58d0dbb7e6d4f05f5d0a5978822476897fe3427787Alexey Bataev 59c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataevint main () { 60c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev static int a; 61c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// CHECK: static int a; 62c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#pragma omp threadprivate(a) 63c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// CHECK-NEXT: #pragma omp threadprivate(a) 64c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev a=2; 65c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev return (foo<int>()); 66c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev} 674fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev 684fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#endif 69