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