diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td @@ -1234,7 +1234,8 @@ // [5.1] 2.21.2 threadprivate Directive //===----------------------------------------------------------------------===// -def ThreadprivateOp : OpenMP_Op<"threadprivate"> { +def ThreadprivateOp : OpenMP_Op<"threadprivate", + [AllTypesMatch<["sym_addr", "tls_addr"]>]> { let summary = "threadprivate directive"; let description = [{ The threadprivate directive specifies that variables are replicated, with diff --git a/mlir/test/Dialect/OpenMP/invalid.mlir b/mlir/test/Dialect/OpenMP/invalid.mlir --- a/mlir/test/Dialect/OpenMP/invalid.mlir +++ b/mlir/test/Dialect/OpenMP/invalid.mlir @@ -1419,3 +1419,14 @@ } return } + +// ----- + +func.func @omp_threadprivate() { + %1 = llvm.mlir.addressof @_QFsubEx : !llvm.ptr + // expected-error @below {{op failed to verify that all of {sym_addr, tls_addr} have same type}} + %2 = omp.threadprivate %1 : !llvm.ptr -> memref + return +} + +llvm.mlir.global internal @_QFsubEx() : i32