00001
00002
00003
00004 extern "C" void abort ();
00005 int cnt;
00006
00007 template <typename T>
00008 void
00009 f0 (T, int)
00010 {
00011 abort ();
00012 }
00013
00014 template <>
00015 void
00016 f0<int> (int, int type)
00017 {
00018 if (type != 0)
00019 abort ();
00020 #pragma omp atomic
00021 cnt++;
00022 }
00023
00024 template <>
00025 void
00026 f0<const char *> (const char *, int type)
00027 {
00028 if (type != 1)
00029 abort ();
00030 #pragma omp atomic
00031 cnt++;
00032 }
00033
00034 template <typename T>
00035 void
00036 f1 ()
00037 {
00038 #pragma omp parallel for
00039 for (int i = 0; i < 10; i++)
00040 f0 (i, 0);
00041 }
00042
00043 template <typename T>
00044 void
00045 f2 ()
00046 {
00047 #pragma omp parallel for
00048 for (T i = T (0); i < T (10); i += T (1))
00049 f0 (i, 0);
00050 }
00051
00052 void
00053 f3 ()
00054 {
00055 #pragma omp parallel for
00056 for (int i = 0; i < 10; i++)
00057 f0 (i, 0);
00058 }
00059
00060 const char *p = "abcdefghij";
00061
00062 template <typename T>
00063 void
00064 f4 ()
00065 {
00066 #pragma omp parallel for
00067 for (const char *i = p; i < p + 10; i += 1)
00068 f0 (i, 1);
00069 }
00070
00071 template <typename T>
00072 void
00073 f5 ()
00074 {
00075 #pragma omp parallel for
00076 for (T i = T (p); i < T (p + 10); i += 1)
00077 f0 (i, 1);
00078 }
00079
00080 void
00081 f6 ()
00082 {
00083 #pragma omp parallel for
00084 for (const char *i = p; i < p + 10; i++)
00085 f0 (i, 1);
00086 }
00087
00088 int
00089 main ()
00090 {
00091 f1<int> ();
00092 if (cnt != 10)
00093 abort ();
00094 f2<int> ();
00095 if (cnt != 20)
00096 abort ();
00097 f3 ();
00098 if (cnt != 30)
00099 abort ();
00100 f4<int> ();
00101 if (cnt != 40)
00102 abort ();
00103 f5<const char *> ();
00104 if (cnt != 50)
00105 abort ();
00106 f6 ();
00107 if (cnt != 60)
00108 abort ();
00109 }