Commit cb8d1b01 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/81154 (OpenMP with shared variable in a template class crash)

	PR c++/81154
	* semantics.c (handle_omp_array_sections_1, finish_omp_clauses):
	Complain about t not being a variable if t is OVERLOAD even
	when processing_template_decl.

	* g++.dg/gomp/pr81154.C: New test.

From-SVN: r249467
parent 1e55769b
2017-06-21 Jakub Jelinek <jakub@redhat.com>
PR c++/81154
* semantics.c (handle_omp_array_sections_1, finish_omp_clauses):
Complain about t not being a variable if t is OVERLOAD even
when processing_template_decl.
2017-06-21 David Malcolm <dmalcolm@redhat.com> 2017-06-21 David Malcolm <dmalcolm@redhat.com>
* parser.c (get_cast_suggestion): New function. * parser.c (get_cast_suggestion): New function.
......
...@@ -4589,7 +4589,7 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types, ...@@ -4589,7 +4589,7 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types,
} }
if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL) if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
{ {
if (processing_template_decl) if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
return NULL_TREE; return NULL_TREE;
if (DECL_P (t)) if (DECL_P (t))
error_at (OMP_CLAUSE_LOCATION (c), error_at (OMP_CLAUSE_LOCATION (c),
...@@ -6109,7 +6109,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) ...@@ -6109,7 +6109,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL
&& (!field_ok || TREE_CODE (t) != FIELD_DECL)) && (!field_ok || TREE_CODE (t) != FIELD_DECL))
{ {
if (processing_template_decl) if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
break; break;
if (DECL_P (t)) if (DECL_P (t))
error ("%qD is not a variable in clause %qs", t, error ("%qD is not a variable in clause %qs", t,
...@@ -6181,7 +6181,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) ...@@ -6181,7 +6181,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
&& ((ort & C_ORT_OMP_DECLARE_SIMD) != C_ORT_OMP && ((ort & C_ORT_OMP_DECLARE_SIMD) != C_ORT_OMP
|| TREE_CODE (t) != FIELD_DECL)) || TREE_CODE (t) != FIELD_DECL))
{ {
if (processing_template_decl) if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
break; break;
if (DECL_P (t)) if (DECL_P (t))
error ("%qD is not a variable in clause %<firstprivate%>", t); error ("%qD is not a variable in clause %<firstprivate%>", t);
...@@ -6224,7 +6224,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) ...@@ -6224,7 +6224,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
&& ((ort & C_ORT_OMP_DECLARE_SIMD) != C_ORT_OMP && ((ort & C_ORT_OMP_DECLARE_SIMD) != C_ORT_OMP
|| TREE_CODE (t) != FIELD_DECL)) || TREE_CODE (t) != FIELD_DECL))
{ {
if (processing_template_decl) if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
break; break;
if (DECL_P (t)) if (DECL_P (t))
error ("%qD is not a variable in clause %<lastprivate%>", t); error ("%qD is not a variable in clause %<lastprivate%>", t);
...@@ -6587,7 +6587,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) ...@@ -6587,7 +6587,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
} }
if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL) if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
{ {
if (processing_template_decl) if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
break; break;
if (DECL_P (t)) if (DECL_P (t))
error ("%qD is not a variable in %<aligned%> clause", t); error ("%qD is not a variable in %<aligned%> clause", t);
...@@ -6669,7 +6669,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) ...@@ -6669,7 +6669,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
remove = true; remove = true;
else if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL) else if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
{ {
if (processing_template_decl) if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
break; break;
if (DECL_P (t)) if (DECL_P (t))
error ("%qD is not a variable in %<depend%> clause", t); error ("%qD is not a variable in %<depend%> clause", t);
...@@ -6800,7 +6800,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) ...@@ -6800,7 +6800,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
} }
if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL) if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
{ {
if (processing_template_decl) if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
break; break;
if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
&& (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER
......
2017-06-21 Jakub Jelinek <jakub@redhat.com>
PR c++/81154
* g++.dg/gomp/pr81154.C: New test.
2017-06-21 David Malcolm <dmalcolm@redhat.com> 2017-06-21 David Malcolm <dmalcolm@redhat.com>
* g++.dg/other/old-style-cast-fixits.C: New test case. * g++.dg/other/old-style-cast-fixits.C: New test case.
......
// PR c++/81154
// { dg-do compile }
template <typename T>
struct C
{
int foo (T n) const
{
#pragma omp parallel shared (foo) // { dg-error "is not a variable in clause" }
;
#pragma omp parallel private (foo) // { dg-error "is not a variable in clause" }
;
#pragma omp parallel firstprivate (foo) // { dg-error "is not a variable in clause" }
;
#pragma omp parallel for lastprivate (foo) // { dg-error "is not a variable in clause" }
for (T i = 0; i < n; i++)
;
#pragma omp parallel for linear (foo) // { dg-error "is not a variable in clause" }
for (T i = 0; i < n; i++)
;
#pragma omp parallel reduction (+:foo) // { dg-error "is not a variable in clause" }
;
return 0;
}
int foo (int x, int y) { return x; }
};
struct D
{
typedef int T;
int foo (T n) const
{
#pragma omp parallel shared (foo) // { dg-error "is not a variable in clause" }
;
#pragma omp parallel private (foo) // { dg-error "is not a variable in clause" }
;
#pragma omp parallel firstprivate (foo) // { dg-error "is not a variable in clause" }
;
#pragma omp parallel for lastprivate (foo) // { dg-error "is not a variable in clause" }
for (T i = 0; i < n; i++)
;
#pragma omp parallel for linear (foo) // { dg-error "is not a variable in clause" }
for (T i = 0; i < n; i++)
;
#pragma omp parallel reduction (+:foo) // { dg-error "is not a variable in clause" }
;
return 0;
}
int foo (int x, int y) { return x; }
};
int
main ()
{
C<int> ().foo (1);
D ().foo (1);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment