[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-11-09 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman closed this revision.
aaron.ballman added a comment.

I've commit on your behalf in b0de656bdf0ee3f4e51d04ae29160dab99819e8e 
 (clang), 
b0de656bdf0ee3f4e51d04ae29160dab99819e8e 
 (llvm), 
and b0de656bdf0ee3f4e51d04ae29160dab99819e8e 
 (flang). 
Thanks!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-11-08 Thread David Pagan via Phabricator via cfe-commits
ddpagan updated this revision to Diff 385692.
ddpagan added a comment.

Fixed build problem (found during build of flang).  Added align clause to 
simple clause check.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

Files:
  clang/include/clang/AST/OpenMPClause.h
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Sema/Sema.h
  clang/lib/AST/DeclPrinter.cpp
  clang/lib/AST/OpenMPClause.cpp
  clang/lib/AST/StmtProfile.cpp
  clang/lib/CodeGen/CGStmtOpenMP.cpp
  clang/lib/Parse/ParseOpenMP.cpp
  clang/lib/Sema/SemaOpenMP.cpp
  clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
  clang/lib/Sema/TreeTransform.h
  clang/lib/Serialization/ASTReader.cpp
  clang/lib/Serialization/ASTReaderDecl.cpp
  clang/lib/Serialization/ASTWriter.cpp
  clang/test/OpenMP/align_clause_ast_print.cpp
  clang/test/OpenMP/align_clause_messages.cpp
  clang/tools/libclang/CIndex.cpp
  flang/lib/Semantics/check-omp-structure.cpp
  llvm/include/llvm/Frontend/OpenMP/OMP.td

Index: llvm/include/llvm/Frontend/OpenMP/OMP.td
===
--- llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -363,6 +363,9 @@
   let clangClass = "OMPFilterClause";
   let flangClass = "ScalarIntExpr";
 }
+def OMPC_Align : Clause<"align"> {
+  let clangClass = "OMPAlignClause";
+}
 def OMPC_When: Clause<"when"> {}
 
 def OMPC_Bind : Clause<"bind"> {
@@ -1539,7 +1542,8 @@
 }
 def OMP_Allocate : Directive<"allocate"> {
   let allowedOnceClauses = [
-VersionedClause
+VersionedClause,
+VersionedClause
   ];
 }
 def OMP_DeclareVariant : Directive<"declare variant"> {
Index: flang/lib/Semantics/check-omp-structure.cpp
===
--- flang/lib/Semantics/check-omp-structure.cpp
+++ flang/lib/Semantics/check-omp-structure.cpp
@@ -1481,6 +1481,7 @@
 CHECK_SIMPLE_CLAUSE(AppendArgs, OMPC_append_args)
 CHECK_SIMPLE_CLAUSE(MemoryOrder, OMPC_memory_order)
 CHECK_SIMPLE_CLAUSE(Bind, OMPC_bind)
+CHECK_SIMPLE_CLAUSE(Align, OMPC_align)
 
 CHECK_REQ_SCALAR_INT_CLAUSE(Grainsize, OMPC_grainsize)
 CHECK_REQ_SCALAR_INT_CLAUSE(NumTasks, OMPC_num_tasks)
Index: clang/tools/libclang/CIndex.cpp
===
--- clang/tools/libclang/CIndex.cpp
+++ clang/tools/libclang/CIndex.cpp
@@ -2315,6 +2315,10 @@
   Visitor->AddStmt(C->getThreadID());
 }
 
+void OMPClauseEnqueue::VisitOMPAlignClause(const OMPAlignClause *C) {
+  Visitor->AddStmt(C->getAlignment());
+}
+
 void OMPClauseEnqueue::VisitOMPUnifiedAddressClause(
 const OMPUnifiedAddressClause *) {}
 
Index: clang/test/OpenMP/align_clause_messages.cpp
===
--- /dev/null
+++ clang/test/OpenMP/align_clause_messages.cpp
@@ -0,0 +1,60 @@
+// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 %s -verify
+
+int foobar() {
+  return 1;
+}
+
+int main(int argc, char *argv[]) {
+  // expected-note@+1 {{declared here}}
+  int a;
+  // expected-note@+1 {{declared here}}
+  int b;
+  // expected-note@+1 {{declared here}}
+  int c;
+  double f;
+  int foo2[10];
+
+// expected-error@+1 {{expected '(' after 'align'}}
+#pragma omp allocate(a) align
+// expected-error@+3 {{expected expression}}
+// expected-error@+2 {{expected ')'}}
+// expected-note@+1 {{to match this '('}}
+#pragma omp allocate(a) align(
+// expected-error@+1 {{expected expression}}
+#pragma omp allocate(a) align()
+// expected-error@+4 {{expected ')'}}
+// expected-note@+3 {{to match this '('}}
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'a' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(a
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'b' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(b)
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'c' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(c + 1)
+// expected-error@+1 {{expected an OpenMP directive}}
+#pragma omp align(2) allocate(a)
+// expected-error@+1 {{directive '#pragma omp allocate' cannot contain more than one 'align' clause}}
+#pragma omp allocate(a) align(2) align(4)
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
+#pragma omp allocate(a) align(9)
+// expected-error@+1 {{integral constant expression must have integral or unscoped enumeration type, not 'double'}}
+#pragma omp allocate(a) align(f)
+}
+
+// Verify appropriate errors when using templates.
+template 
+T run() {
+  T foo[size];
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a 

RE: [PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-11-08 Thread Pagan, David via cfe-commits
Thanks, Aaron. I'll check this out.

-Original Message-
From: Aaron Ballman via Phabricator  
Sent: Monday, November 8, 2021 3:48 AM
To: Pagan, David ; a.bat...@hotmail.com; 
jdoerf...@anl.gov
Cc: stefomeis...@gmail.com; cfe-commits@lists.llvm.org; 
llvm-comm...@lists.llvm.org; yaxun@amd.com; zhang.guans...@gmail.com; 
arpha...@gmail.com; bhuvanendra.kum...@amd.com; Mu, Yanliang 
; dougp...@gmail.com; mlek...@skidmore.edu; 
blitzrak...@gmail.com; shen...@google.com; michael.hl...@gmail.com; 
david.gr...@arm.com; ruiling.s...@amd.com
Subject: [PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' 
clause

aaron.ballman added a comment.

Before I land this, it looks like precommit CI is failing with what possibly is 
a related failure:

  [9094/9117] Linking CXX executable 
tools/flang/unittests/Frontend/FlangFrontendTests
  FAILED: tools/flang/unittests/Frontend/FlangFrontendTests
  : && /usr/bin/clang++ -gmlt -fPIC -fvisibility-inlines-hidden 
-Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra 
-Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers 
-pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough 
-Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor 
-Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion 
-Wmisleading-indentation -fdiagnostics-color -ffunction-sections 
-fdata-sections -Wno-deprecated-copy -Wno-string-conversion 
-Wno-unused-command-line-argument -Wstring-conversion   
-Wcovered-switch-default -Wno-nested-anon-types -O3 -DNDEBUG -fuse-ld=lld 
-Wl,--color-diagnostics-Wl,-O3 -Wl,--gc-sections 
tools/flang/unittests/Frontend/CMakeFiles/FlangFrontendTests.dir/CompilerInstanceTest.cpp.o
 
tools/flang/unittests/Frontend/CMakeFiles/FlangFrontendTests.dir/FrontendActionTest.cpp.o
 -o tools/flang/unittests/Frontend/FlangFrontendTests  lib/libLLVMSupport.a  
-lpthread  lib/libgtest_main.a  lib/libgtest.a  -lpthread  lib/libclangBasic.a  
lib/libflangFrontend.a  lib/libflangFrontendTool.a  lib/libFortranParser.a  
lib/libFortranSemantics.a  lib/libFortranCommon.a  lib/libFortranEvaluate.a  
-lpthread  lib/libflangFrontend.a  lib/libFortranLower.a  
lib/libFortranSemantics.a  lib/libFortranEvaluate.a  lib/libFortranParser.a  
lib/libFortranCommon.a  lib/libFortranDecimal.a  lib/libFIRTransforms.a  
lib/libFIRDialect.a  lib/libMLIROpenMPToLLVM.a  lib/libMLIRMemRefToLLVM.a  
lib/libFIRSupport.a  lib/libMLIROpenMPToLLVMIRTranslation.a  
lib/libMLIRAffineTransforms.a  lib/libMLIRAsyncTransforms.a  lib/libMLIREmitC.a 
 lib/libMLIRGPUTransforms.a  lib/libMLIRAsync.a  lib/libMLIRGPUOps.a  
lib/libMLIRDLTI.a  lib/libMLIRLLVMToLLVMIRTranslation.a  
lib/libLLVMNVPTXCodeGen.a  lib/libLLVMNVPTXDesc.a  lib/libLLVMNVPTXInfo.a  
lib/libLLVMAMDGPUAsmParser.a  lib/libLLVMAMDGPUCodeGen.a  
lib/libLLVMAsmPrinter.a  lib/libLLVMDebugInfoDWARF.a  lib/libLLVMDebugInfoMSF.a 
 lib/libLLVMPasses.a  lib/libLLVMCoroutines.a  lib/libLLVMipo.a  
lib/libLLVMVectorize.a  lib/libLLVMIRReader.a  lib/libLLVMLinker.a  
lib/libLLVMInstrumentation.a  lib/libLLVMObjCARCOpts.a  lib/libLLVMGlobalISel.a 
 lib/libLLVMSelectionDAG.a  lib/libLLVMMIRParser.a  lib/libLLVMCodeGen.a  
lib/libLLVMTarget.a  lib/libLLVMAMDGPUDesc.a  lib/libLLVMAMDGPUUtils.a  
lib/libLLVMAMDGPUInfo.a  lib/libMLIRNVVMIR.a  lib/libMLIRROCDLIR.a  
lib/libMLIRVectorToLLVM.a  lib/libMLIRArmNeon.a  lib/libMLIRArmSVETransforms.a  
lib/libMLIRArmSVE.a  lib/libMLIRAMXTransforms.a  lib/libMLIRAMX.a  
lib/libMLIRTargetLLVMIRExport.a  lib/libMLIRLLVMIRTransforms.a  
lib/libMLIRTranslation.a  lib/libMLIRMathTransforms.a  
lib/libMLIRMemRefTransforms.a  lib/libMLIROpenACC.a  lib/libMLIROpenMP.a  
lib/libMLIRShapeOpsTransforms.a  lib/libMLIRShape.a  
lib/libMLIRSparseTensorTransforms.a  lib/libMLIRLinalgTransforms.a  
lib/libMLIRComplex.a  lib/libMLIRLinalgAnalysis.a  
lib/libMLIRComprehensiveBufferize.a  lib/libMLIRBufferizableOpInterface.a  
lib/libMLIRLinalgUtils.a  lib/libMLIRSCFTransforms.a  
lib/libMLIRStandardToLLVM.a  lib/libMLIRArithmeticToLLVM.a  
lib/libMLIRVectorToSCF.a  lib/libMLIRSparseTensor.a  
lib/libMLIRSparseTensorUtils.a  lib/libMLIRSPIRVModuleCombiner.a  
lib/libMLIRSPIRVTransforms.a  lib/libMLIRSPIRVConversion.a  
lib/libMLIRSPIRVUtils.a  lib/libMLIRSPIRV.a  lib/libMLIRStandardOpsTransforms.a 
 lib/libMLIRArithmeticTransforms.a  lib/libMLIRTensorTransforms.a  
lib/libMLIRTosaTransforms.a  lib/libMLIRX86VectorTransforms.a  
lib/libMLIRX86Vector.a  lib/libMLIRLLVMCommonConversion.a  lib/libMLIRLLVMIR.a  
lib/libLLVMAsmParser.a  lib/libLLVMBitWriter.a  lib/libMLIRTosaTestPasses.a  
lib/libMLIRTosa.a  lib/libMLIRQuant.a  lib/libMLIRAffineToStandard.a  
lib/libMLIRSCFToStandard.a  lib/libMLIRTransforms.a  lib/libMLIRVector.a  
lib/libMLIRAffineUtils.a  lib/libMLIRLinalg.a  lib/libMLIRMath.a  
lib/libMLIRParser.a  lib/libMLIRTilingInterface.a  lib/libMLIRTransformUtils.a  
lib/libMLIRLoopAnalysis.a  lib/libMLIRAffine.a  lib/libMLIRSCF

[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-11-08 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman added a comment.

Before I land this, it looks like precommit CI is failing with what possibly is 
a related failure:

  [9094/9117] Linking CXX executable 
tools/flang/unittests/Frontend/FlangFrontendTests
  FAILED: tools/flang/unittests/Frontend/FlangFrontendTests
  : && /usr/bin/clang++ -gmlt -fPIC -fvisibility-inlines-hidden 
-Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra 
-Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers 
-pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough 
-Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor 
-Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion 
-Wmisleading-indentation -fdiagnostics-color -ffunction-sections 
-fdata-sections -Wno-deprecated-copy -Wno-string-conversion 
-Wno-unused-command-line-argument -Wstring-conversion   
-Wcovered-switch-default -Wno-nested-anon-types -O3 -DNDEBUG -fuse-ld=lld 
-Wl,--color-diagnostics-Wl,-O3 -Wl,--gc-sections 
tools/flang/unittests/Frontend/CMakeFiles/FlangFrontendTests.dir/CompilerInstanceTest.cpp.o
 
tools/flang/unittests/Frontend/CMakeFiles/FlangFrontendTests.dir/FrontendActionTest.cpp.o
 -o tools/flang/unittests/Frontend/FlangFrontendTests  lib/libLLVMSupport.a  
-lpthread  lib/libgtest_main.a  lib/libgtest.a  -lpthread  lib/libclangBasic.a  
lib/libflangFrontend.a  lib/libflangFrontendTool.a  lib/libFortranParser.a  
lib/libFortranSemantics.a  lib/libFortranCommon.a  lib/libFortranEvaluate.a  
-lpthread  lib/libflangFrontend.a  lib/libFortranLower.a  
lib/libFortranSemantics.a  lib/libFortranEvaluate.a  lib/libFortranParser.a  
lib/libFortranCommon.a  lib/libFortranDecimal.a  lib/libFIRTransforms.a  
lib/libFIRDialect.a  lib/libMLIROpenMPToLLVM.a  lib/libMLIRMemRefToLLVM.a  
lib/libFIRSupport.a  lib/libMLIROpenMPToLLVMIRTranslation.a  
lib/libMLIRAffineTransforms.a  lib/libMLIRAsyncTransforms.a  lib/libMLIREmitC.a 
 lib/libMLIRGPUTransforms.a  lib/libMLIRAsync.a  lib/libMLIRGPUOps.a  
lib/libMLIRDLTI.a  lib/libMLIRLLVMToLLVMIRTranslation.a  
lib/libLLVMNVPTXCodeGen.a  lib/libLLVMNVPTXDesc.a  lib/libLLVMNVPTXInfo.a  
lib/libLLVMAMDGPUAsmParser.a  lib/libLLVMAMDGPUCodeGen.a  
lib/libLLVMAsmPrinter.a  lib/libLLVMDebugInfoDWARF.a  lib/libLLVMDebugInfoMSF.a 
 lib/libLLVMPasses.a  lib/libLLVMCoroutines.a  lib/libLLVMipo.a  
lib/libLLVMVectorize.a  lib/libLLVMIRReader.a  lib/libLLVMLinker.a  
lib/libLLVMInstrumentation.a  lib/libLLVMObjCARCOpts.a  lib/libLLVMGlobalISel.a 
 lib/libLLVMSelectionDAG.a  lib/libLLVMMIRParser.a  lib/libLLVMCodeGen.a  
lib/libLLVMTarget.a  lib/libLLVMAMDGPUDesc.a  lib/libLLVMAMDGPUUtils.a  
lib/libLLVMAMDGPUInfo.a  lib/libMLIRNVVMIR.a  lib/libMLIRROCDLIR.a  
lib/libMLIRVectorToLLVM.a  lib/libMLIRArmNeon.a  lib/libMLIRArmSVETransforms.a  
lib/libMLIRArmSVE.a  lib/libMLIRAMXTransforms.a  lib/libMLIRAMX.a  
lib/libMLIRTargetLLVMIRExport.a  lib/libMLIRLLVMIRTransforms.a  
lib/libMLIRTranslation.a  lib/libMLIRMathTransforms.a  
lib/libMLIRMemRefTransforms.a  lib/libMLIROpenACC.a  lib/libMLIROpenMP.a  
lib/libMLIRShapeOpsTransforms.a  lib/libMLIRShape.a  
lib/libMLIRSparseTensorTransforms.a  lib/libMLIRLinalgTransforms.a  
lib/libMLIRComplex.a  lib/libMLIRLinalgAnalysis.a  
lib/libMLIRComprehensiveBufferize.a  lib/libMLIRBufferizableOpInterface.a  
lib/libMLIRLinalgUtils.a  lib/libMLIRSCFTransforms.a  
lib/libMLIRStandardToLLVM.a  lib/libMLIRArithmeticToLLVM.a  
lib/libMLIRVectorToSCF.a  lib/libMLIRSparseTensor.a  
lib/libMLIRSparseTensorUtils.a  lib/libMLIRSPIRVModuleCombiner.a  
lib/libMLIRSPIRVTransforms.a  lib/libMLIRSPIRVConversion.a  
lib/libMLIRSPIRVUtils.a  lib/libMLIRSPIRV.a  lib/libMLIRStandardOpsTransforms.a 
 lib/libMLIRArithmeticTransforms.a  lib/libMLIRTensorTransforms.a  
lib/libMLIRTosaTransforms.a  lib/libMLIRX86VectorTransforms.a  
lib/libMLIRX86Vector.a  lib/libMLIRLLVMCommonConversion.a  lib/libMLIRLLVMIR.a  
lib/libLLVMAsmParser.a  lib/libLLVMBitWriter.a  lib/libMLIRTosaTestPasses.a  
lib/libMLIRTosa.a  lib/libMLIRQuant.a  lib/libMLIRAffineToStandard.a  
lib/libMLIRSCFToStandard.a  lib/libMLIRTransforms.a  lib/libMLIRVector.a  
lib/libMLIRAffineUtils.a  lib/libMLIRLinalg.a  lib/libMLIRMath.a  
lib/libMLIRParser.a  lib/libMLIRTilingInterface.a  lib/libMLIRTransformUtils.a  
lib/libMLIRLoopAnalysis.a  lib/libMLIRAffine.a  lib/libMLIRSCF.a  
lib/libMLIRMemRef.a  lib/libMLIRMemRefUtils.a  lib/libMLIRTensor.a  
lib/libMLIRDialectUtils.a  lib/libMLIRStandard.a  lib/libMLIRArithmetic.a  
lib/libMLIRDialect.a  lib/libMLIRCastInterfaces.a  
lib/libMLIRVectorInterfaces.a  lib/libMLIRLoopLikeInterface.a  
lib/libMLIRPresburger.a  lib/libMLIRRewrite.a  lib/libMLIRPDLToPDLInterp.a  
lib/libMLIRPDLInterp.a  lib/libMLIRPDL.a  lib/libMLIRPass.a  
lib/libMLIRAnalysis.a  lib/libMLIRSideEffectInterfaces.a  
lib/libMLIRDataLayoutInterfaces.a  lib/libMLIRInferTypeOpInterface.a  
lib/libMLIRViewLikeInterface.a  lib/libMLIRCallInterfaces.a  
lib/libMLIRControlFlowInterfaces.a  

[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-11-05 Thread David Pagan via Phabricator via cfe-commits
ddpagan updated this revision to Diff 385098.
ddpagan added a comment.

Successfully rebased, built, and tested.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

Files:
  clang/include/clang/AST/OpenMPClause.h
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Sema/Sema.h
  clang/lib/AST/DeclPrinter.cpp
  clang/lib/AST/OpenMPClause.cpp
  clang/lib/AST/StmtProfile.cpp
  clang/lib/CodeGen/CGStmtOpenMP.cpp
  clang/lib/Parse/ParseOpenMP.cpp
  clang/lib/Sema/SemaOpenMP.cpp
  clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
  clang/lib/Sema/TreeTransform.h
  clang/lib/Serialization/ASTReader.cpp
  clang/lib/Serialization/ASTReaderDecl.cpp
  clang/lib/Serialization/ASTWriter.cpp
  clang/test/OpenMP/align_clause_ast_print.cpp
  clang/test/OpenMP/align_clause_messages.cpp
  clang/tools/libclang/CIndex.cpp
  llvm/include/llvm/Frontend/OpenMP/OMP.td

Index: llvm/include/llvm/Frontend/OpenMP/OMP.td
===
--- llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -363,6 +363,9 @@
   let clangClass = "OMPFilterClause";
   let flangClass = "ScalarIntExpr";
 }
+def OMPC_Align : Clause<"align"> {
+  let clangClass = "OMPAlignClause";
+}
 def OMPC_When: Clause<"when"> {}
 
 def OMPC_Bind : Clause<"bind"> {
@@ -1539,7 +1542,8 @@
 }
 def OMP_Allocate : Directive<"allocate"> {
   let allowedOnceClauses = [
-VersionedClause
+VersionedClause,
+VersionedClause
   ];
 }
 def OMP_DeclareVariant : Directive<"declare variant"> {
Index: clang/tools/libclang/CIndex.cpp
===
--- clang/tools/libclang/CIndex.cpp
+++ clang/tools/libclang/CIndex.cpp
@@ -2315,6 +2315,10 @@
   Visitor->AddStmt(C->getThreadID());
 }
 
+void OMPClauseEnqueue::VisitOMPAlignClause(const OMPAlignClause *C) {
+  Visitor->AddStmt(C->getAlignment());
+}
+
 void OMPClauseEnqueue::VisitOMPUnifiedAddressClause(
 const OMPUnifiedAddressClause *) {}
 
Index: clang/test/OpenMP/align_clause_messages.cpp
===
--- /dev/null
+++ clang/test/OpenMP/align_clause_messages.cpp
@@ -0,0 +1,60 @@
+// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 %s -verify
+
+int foobar() {
+  return 1;
+}
+
+int main(int argc, char *argv[]) {
+  // expected-note@+1 {{declared here}}
+  int a;
+  // expected-note@+1 {{declared here}}
+  int b;
+  // expected-note@+1 {{declared here}}
+  int c;
+  double f;
+  int foo2[10];
+
+// expected-error@+1 {{expected '(' after 'align'}}
+#pragma omp allocate(a) align
+// expected-error@+3 {{expected expression}}
+// expected-error@+2 {{expected ')'}}
+// expected-note@+1 {{to match this '('}}
+#pragma omp allocate(a) align(
+// expected-error@+1 {{expected expression}}
+#pragma omp allocate(a) align()
+// expected-error@+4 {{expected ')'}}
+// expected-note@+3 {{to match this '('}}
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'a' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(a
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'b' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(b)
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'c' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(c + 1)
+// expected-error@+1 {{expected an OpenMP directive}}
+#pragma omp align(2) allocate(a)
+// expected-error@+1 {{directive '#pragma omp allocate' cannot contain more than one 'align' clause}}
+#pragma omp allocate(a) align(2) align(4)
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
+#pragma omp allocate(a) align(9)
+// expected-error@+1 {{integral constant expression must have integral or unscoped enumeration type, not 'double'}}
+#pragma omp allocate(a) align(f)
+}
+
+// Verify appropriate errors when using templates.
+template 
+T run() {
+  T foo[size];
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
+#pragma omp allocate(foo) align(align)
+  return foo[0];
+}
+
+int template_test() {
+  double d;
+  // expected-note@+1 {{in instantiation of function template specialization 'run' requested here}}
+  d = run();
+  return 0;
+}
Index: clang/test/OpenMP/align_clause_ast_print.cpp
===
--- /dev/null
+++ clang/test/OpenMP/align_clause_ast_print.cpp
@@ -0,0 +1,134 @@
+// expected-no-diagnostics
+
+//RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
+//RUN:   -x c++ -std=c++14 -fexceptions -fcxx-exceptions   \

[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-11-04 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman added a comment.

Ah, thank you for the explanations! Then this continues to LGTM. Do you need 
someone to commit on your behalf? If so, what name and email address would you 
like me to use for patch attribution in git?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-11-03 Thread David Pagan via Phabricator via cfe-commits
ddpagan added a comment.

Thanks for reviewing the code, Aaron.




Comment at: clang/lib/Serialization/ASTWriter.cpp:5018
 Record.AddStmt(A->getAllocator());
+Record.AddStmt(A->getAlignment());
 Record.AddSourceRange(A->getRange());

aaron.ballman wrote:
> This can potentially add a null statement to emit to the serialized form.
The same thing can occur with A->getAllocator(). However, it's expected 
behavior. When these values are read in later, the allocator and alignment 
values are use to set the appropriate fields in the allocate directive. Null 
values are okay as they indicate whether or not a field has been specified (via 
an align or allocator clause).



Comment at: clang/lib/Serialization/ASTWriter.cpp:6224
+void OMPClauseWriter::VisitOMPAlignClause(OMPAlignClause *C) {
+  Record.AddStmt(C->getAlignment());
+  Record.AddSourceLocation(C->getLParenLoc());

aaron.ballman wrote:
> Same for this one, maybe?
This is called only when an align clause has been specified, so it's guaranteed 
to not be null.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-11-02 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman accepted this revision.
aaron.ballman added a comment.

LGTM aside from some possible nits.




Comment at: clang/lib/Serialization/ASTWriter.cpp:5018
 Record.AddStmt(A->getAllocator());
+Record.AddStmt(A->getAlignment());
 Record.AddSourceRange(A->getRange());

This can potentially add a null statement to emit to the serialized form.



Comment at: clang/lib/Serialization/ASTWriter.cpp:6224
+void OMPClauseWriter::VisitOMPAlignClause(OMPAlignClause *C) {
+  Record.AddStmt(C->getAlignment());
+  Record.AddSourceLocation(C->getLParenLoc());

Same for this one, maybe?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-10-29 Thread David Pagan via Phabricator via cfe-commits
ddpagan added inline comments.



Comment at: clang/include/clang/AST/OpenMPClause.h:362-364
+  /// Sets the location of '('.
+  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
+

aaron.ballman wrote:
> ABataev wrote:
> > Also worth to make it private
> I agree, I think these constructors should have their access reduced to at 
> least `protected`.
Agreed. I made them private, then created a function to build the clause rather 
than reference the constructor directly. This is similar to what we do for some 
other clauses. 



Comment at: clang/include/clang/AST/OpenMPClause.h:369
+  /// Returns alignment
+  Expr *getAlignment() const { return cast_or_null(Alignment); }
+

aaron.ballman wrote:
> I have a preference for improved const-correctness with this sort of thing, 
> where I'd rather see an overloaded pair of functions:
> ```
> const Expr *getAlignment() const { return cast_or_null(Alignment); }
> Expr *getAlignment() { return cast_or_null(Alignment); }
> ```
> 
> 
Agreed. Unfortunately, OpenMP code isn't set up well for this. A few clauses 
are, but not this one. So, trying to make this change led to an ugly rat's nest 
of other changes outside the scope of this fix. I'd like to see new clauses 
follow this pattern, though.



Comment at: clang/lib/AST/OpenMPClause.cpp:1615
+  OS << "align(";
+  Node->getAlignment()->printPretty(OS, nullptr, Policy, 0);
+  OS << ")";

aaron.ballman wrote:
> `getAlignment()` can return nullptr and it looks like the vast majority of 
> the calls to it are unprotected like this. Would it make sense to ensure that 
> `OMPAlignClause` can never have a nonnull alignment expression?
This particular code is only called when a legitimate align clause has been 
used, so we are guaranteed a non-nullptr. I looked over other references to 
getAlignment (most from other classes) and it didn't appear that any of them 
were unsafe.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-10-29 Thread David Pagan via Phabricator via cfe-commits
ddpagan updated this revision to Diff 383428.
ddpagan added a comment.

Thanks for the review, Aaron.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

Files:
  clang/include/clang/AST/OpenMPClause.h
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Sema/Sema.h
  clang/lib/AST/DeclPrinter.cpp
  clang/lib/AST/OpenMPClause.cpp
  clang/lib/AST/StmtProfile.cpp
  clang/lib/CodeGen/CGStmtOpenMP.cpp
  clang/lib/Parse/ParseOpenMP.cpp
  clang/lib/Sema/SemaOpenMP.cpp
  clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
  clang/lib/Sema/TreeTransform.h
  clang/lib/Serialization/ASTReader.cpp
  clang/lib/Serialization/ASTReaderDecl.cpp
  clang/lib/Serialization/ASTWriter.cpp
  clang/test/OpenMP/align_clause_ast_print.cpp
  clang/test/OpenMP/align_clause_messages.cpp
  clang/tools/libclang/CIndex.cpp
  llvm/include/llvm/Frontend/OpenMP/OMP.td

Index: llvm/include/llvm/Frontend/OpenMP/OMP.td
===
--- llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -341,6 +341,9 @@
   let clangClass = "OMPFilterClause";
   let flangClass = "ScalarIntExpr";
 }
+def OMPC_Align : Clause<"align"> {
+  let clangClass = "OMPAlignClause";
+}
 def OMPC_When: Clause<"when"> {}
 
 //===--===//
@@ -1513,7 +1516,8 @@
 }
 def OMP_Allocate : Directive<"allocate"> {
   let allowedOnceClauses = [
-VersionedClause
+VersionedClause,
+VersionedClause
   ];
 }
 def OMP_DeclareVariant : Directive<"declare variant"> {
Index: clang/tools/libclang/CIndex.cpp
===
--- clang/tools/libclang/CIndex.cpp
+++ clang/tools/libclang/CIndex.cpp
@@ -2315,6 +2315,10 @@
   Visitor->AddStmt(C->getThreadID());
 }
 
+void OMPClauseEnqueue::VisitOMPAlignClause(const OMPAlignClause *C) {
+  Visitor->AddStmt(C->getAlignment());
+}
+
 void OMPClauseEnqueue::VisitOMPUnifiedAddressClause(
 const OMPUnifiedAddressClause *) {}
 
Index: clang/test/OpenMP/align_clause_messages.cpp
===
--- /dev/null
+++ clang/test/OpenMP/align_clause_messages.cpp
@@ -0,0 +1,60 @@
+// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 %s -verify
+
+int foobar() {
+  return 1;
+}
+
+int main(int argc, char *argv[]) {
+  // expected-note@+1 {{declared here}}
+  int a;
+  // expected-note@+1 {{declared here}}
+  int b;
+  // expected-note@+1 {{declared here}}
+  int c;
+  double f;
+  int foo2[10];
+
+// expected-error@+1 {{expected '(' after 'align'}}
+#pragma omp allocate(a) align
+// expected-error@+3 {{expected expression}}
+// expected-error@+2 {{expected ')'}}
+// expected-note@+1 {{to match this '('}}
+#pragma omp allocate(a) align(
+// expected-error@+1 {{expected expression}}
+#pragma omp allocate(a) align()
+// expected-error@+4 {{expected ')'}}
+// expected-note@+3 {{to match this '('}}
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'a' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(a
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'b' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(b)
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'c' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(c + 1)
+// expected-error@+1 {{expected an OpenMP directive}}
+#pragma omp align(2) allocate(a)
+// expected-error@+1 {{directive '#pragma omp allocate' cannot contain more than one 'align' clause}}
+#pragma omp allocate(a) align(2) align(4)
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
+#pragma omp allocate(a) align(9)
+// expected-error@+1 {{integral constant expression must have integral or unscoped enumeration type, not 'double'}}
+#pragma omp allocate(a) align(f)
+}
+
+// Verify appropriate errors when using templates.
+template 
+T run() {
+  T foo[size];
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
+#pragma omp allocate(foo) align(align)
+  return foo[0];
+}
+
+int template_test() {
+  double d;
+  // expected-note@+1 {{in instantiation of function template specialization 'run' requested here}}
+  d = run();
+  return 0;
+}
Index: clang/test/OpenMP/align_clause_ast_print.cpp
===
--- /dev/null
+++ clang/test/OpenMP/align_clause_ast_print.cpp
@@ -0,0 +1,134 @@
+// expected-no-diagnostics
+
+//RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
+//RUN:   -x c++ -std=c++14 -fexceptions 

[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-10-27 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman added inline comments.



Comment at: clang/include/clang/AST/OpenMPClause.h:362-364
+  /// Sets the location of '('.
+  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
+

ABataev wrote:
> Also worth to make it private
I agree, I think these constructors should have their access reduced to at 
least `protected`.



Comment at: clang/include/clang/AST/OpenMPClause.h:369
+  /// Returns alignment
+  Expr *getAlignment() const { return cast_or_null(Alignment); }
+

I have a preference for improved const-correctness with this sort of thing, 
where I'd rather see an overloaded pair of functions:
```
const Expr *getAlignment() const { return cast_or_null(Alignment); }
Expr *getAlignment() { return cast_or_null(Alignment); }
```





Comment at: clang/lib/AST/OpenMPClause.cpp:1615
+  OS << "align(";
+  Node->getAlignment()->printPretty(OS, nullptr, Policy, 0);
+  OS << ")";

`getAlignment()` can return nullptr and it looks like the vast majority of the 
calls to it are unprotected like this. Would it make sense to ensure that 
`OMPAlignClause` can never have a nonnull alignment expression?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-10-27 Thread Alexey Bataev via Phabricator via cfe-commits
ABataev accepted this revision.
ABataev added a comment.
This revision is now accepted and ready to land.

LG


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-10-27 Thread David Pagan via Phabricator via cfe-commits
ddpagan updated this revision to Diff 382701.
ddpagan added a comment.

Thanks for the review, Alexey.

Made the requested changes except for modifying "used_children". After looking 
over other clause classes, for example, OMPNumThreadsClause, we're being 
consistent in how we're declaring these. Let me know if I'm missing something 
there.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

Files:
  clang/include/clang/AST/OpenMPClause.h
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Sema/Sema.h
  clang/lib/AST/DeclPrinter.cpp
  clang/lib/AST/OpenMPClause.cpp
  clang/lib/AST/StmtProfile.cpp
  clang/lib/CodeGen/CGStmtOpenMP.cpp
  clang/lib/Parse/ParseOpenMP.cpp
  clang/lib/Sema/SemaOpenMP.cpp
  clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
  clang/lib/Sema/TreeTransform.h
  clang/lib/Serialization/ASTReader.cpp
  clang/lib/Serialization/ASTReaderDecl.cpp
  clang/lib/Serialization/ASTWriter.cpp
  clang/test/OpenMP/align_clause_ast_print.cpp
  clang/test/OpenMP/align_clause_messages.cpp
  clang/tools/libclang/CIndex.cpp
  llvm/include/llvm/Frontend/OpenMP/OMP.td

Index: llvm/include/llvm/Frontend/OpenMP/OMP.td
===
--- llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -341,6 +341,9 @@
   let clangClass = "OMPFilterClause";
   let flangClass = "ScalarIntExpr";
 }
+def OMPC_Align : Clause<"align"> {
+  let clangClass = "OMPAlignClause";
+}
 def OMPC_When: Clause<"when"> {}
 
 //===--===//
@@ -1513,7 +1516,8 @@
 }
 def OMP_Allocate : Directive<"allocate"> {
   let allowedOnceClauses = [
-VersionedClause
+VersionedClause,
+VersionedClause
   ];
 }
 def OMP_DeclareVariant : Directive<"declare variant"> {
Index: clang/tools/libclang/CIndex.cpp
===
--- clang/tools/libclang/CIndex.cpp
+++ clang/tools/libclang/CIndex.cpp
@@ -2315,6 +2315,10 @@
   Visitor->AddStmt(C->getThreadID());
 }
 
+void OMPClauseEnqueue::VisitOMPAlignClause(const OMPAlignClause *C) {
+  Visitor->AddStmt(C->getAlignment());
+}
+
 void OMPClauseEnqueue::VisitOMPUnifiedAddressClause(
 const OMPUnifiedAddressClause *) {}
 
Index: clang/test/OpenMP/align_clause_messages.cpp
===
--- /dev/null
+++ clang/test/OpenMP/align_clause_messages.cpp
@@ -0,0 +1,60 @@
+// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 %s -verify
+
+int foobar() {
+  return 1;
+}
+
+int main(int argc, char *argv[]) {
+  // expected-note@+1 {{declared here}}
+  int a;
+  // expected-note@+1 {{declared here}}
+  int b;
+  // expected-note@+1 {{declared here}}
+  int c;
+  double f;
+  int foo2[10];
+
+// expected-error@+1 {{expected '(' after 'align'}}
+#pragma omp allocate(a) align
+// expected-error@+3 {{expected expression}}
+// expected-error@+2 {{expected ')'}}
+// expected-note@+1 {{to match this '('}}
+#pragma omp allocate(a) align(
+// expected-error@+1 {{expected expression}}
+#pragma omp allocate(a) align()
+// expected-error@+4 {{expected ')'}}
+// expected-note@+3 {{to match this '('}}
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'a' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(a
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'b' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(b)
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'c' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(c + 1)
+// expected-error@+1 {{expected an OpenMP directive}}
+#pragma omp align(2) allocate(a)
+// expected-error@+1 {{directive '#pragma omp allocate' cannot contain more than one 'align' clause}}
+#pragma omp allocate(a) align(2) align(4)
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
+#pragma omp allocate(a) align(9)
+// expected-error@+1 {{integral constant expression must have integral or unscoped enumeration type, not 'double'}}
+#pragma omp allocate(a) align(f)
+}
+
+// Verify appropriate errors when using templates.
+template 
+T run() {
+  T foo[size];
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
+#pragma omp allocate(foo) align(align)
+  return foo[0];
+}
+
+int template_test() {
+  double d;
+  // expected-note@+1 {{in instantiation of function template specialization 'run' requested here}}
+  d = run();
+  return 0;
+}
Index: clang/test/OpenMP/align_clause_ast_print.cpp

[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-10-27 Thread Alexey Bataev via Phabricator via cfe-commits
ABataev added inline comments.



Comment at: clang/include/clang/AST/OpenMPClause.h:334
+/// value of 8.
+class OMPAlignClause : public OMPClause {
+  friend class OMPClauseReader;

`final`



Comment at: clang/include/clang/AST/OpenMPClause.h:362-364
+  /// Sets the location of '('.
+  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
+

Also worth to make it private



Comment at: clang/include/clang/AST/OpenMPClause.h:377-382
+  child_range used_children() {
+return child_range(child_iterator(), child_iterator());
+  }
+  const_child_range used_children() const {
+return const_child_range(const_child_iterator(), const_child_iterator());
+  }

IIRC, must return same as `children` here


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112577/new/

https://reviews.llvm.org/D112577

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112577: [clang][OpenMP] Initial parsing/sema for 'align' clause

2021-10-26 Thread David Pagan via Phabricator via cfe-commits
ddpagan created this revision.
ddpagan added reviewers: ABataev, jdoerfert.
Herald added subscribers: arphaman, guansong, yaxunl.
Herald added a reviewer: aaron.ballman.
ddpagan requested review of this revision.
Herald added subscribers: llvm-commits, cfe-commits, sstefan1.
Herald added projects: clang, LLVM.

[OPENMP51] Added basic parsing/sema/serialization support for 'align' clause 
for use with 'allocate' directive.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D112577

Files:
  clang/include/clang/AST/OpenMPClause.h
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Sema/Sema.h
  clang/lib/AST/DeclPrinter.cpp
  clang/lib/AST/OpenMPClause.cpp
  clang/lib/AST/StmtProfile.cpp
  clang/lib/CodeGen/CGStmtOpenMP.cpp
  clang/lib/Parse/ParseOpenMP.cpp
  clang/lib/Sema/SemaOpenMP.cpp
  clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
  clang/lib/Sema/TreeTransform.h
  clang/lib/Serialization/ASTReader.cpp
  clang/lib/Serialization/ASTReaderDecl.cpp
  clang/lib/Serialization/ASTWriter.cpp
  clang/test/OpenMP/align_clause_ast_print.cpp
  clang/test/OpenMP/align_clause_messages.cpp
  clang/tools/libclang/CIndex.cpp
  llvm/include/llvm/Frontend/OpenMP/OMP.td

Index: llvm/include/llvm/Frontend/OpenMP/OMP.td
===
--- llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -341,6 +341,9 @@
   let clangClass = "OMPFilterClause";
   let flangClass = "ScalarIntExpr";
 }
+def OMPC_Align : Clause<"align"> {
+  let clangClass = "OMPAlignClause";
+}
 def OMPC_When: Clause<"when"> {}
 
 //===--===//
@@ -1513,7 +1516,8 @@
 }
 def OMP_Allocate : Directive<"allocate"> {
   let allowedOnceClauses = [
-VersionedClause
+VersionedClause,
+VersionedClause
   ];
 }
 def OMP_DeclareVariant : Directive<"declare variant"> {
Index: clang/tools/libclang/CIndex.cpp
===
--- clang/tools/libclang/CIndex.cpp
+++ clang/tools/libclang/CIndex.cpp
@@ -2315,6 +2315,10 @@
   Visitor->AddStmt(C->getThreadID());
 }
 
+void OMPClauseEnqueue::VisitOMPAlignClause(const OMPAlignClause *C) {
+  Visitor->AddStmt(C->getAlignment());
+}
+
 void OMPClauseEnqueue::VisitOMPUnifiedAddressClause(
 const OMPUnifiedAddressClause *) {}
 
Index: clang/test/OpenMP/align_clause_messages.cpp
===
--- /dev/null
+++ clang/test/OpenMP/align_clause_messages.cpp
@@ -0,0 +1,60 @@
+// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 %s -verify
+
+int foobar() {
+  return 1;
+}
+
+int main(int argc, char *argv[]) {
+  // expected-note@+1 {{declared here}}
+  int a;
+  // expected-note@+1 {{declared here}}
+  int b;
+  // expected-note@+1 {{declared here}}
+  int c;
+  double f;
+  int foo2[10];
+
+// expected-error@+1 {{expected '(' after 'align'}}
+#pragma omp allocate(a) align
+// expected-error@+3 {{expected expression}}
+// expected-error@+2 {{expected ')'}}
+// expected-note@+1 {{to match this '('}}
+#pragma omp allocate(a) align(
+// expected-error@+1 {{expected expression}}
+#pragma omp allocate(a) align()
+// expected-error@+4 {{expected ')'}}
+// expected-note@+3 {{to match this '('}}
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'a' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(a
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'b' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(b)
+// expected-error@+2 {{expression is not an integral constant expression}}
+// expected-note@+1 {{read of non-const variable 'c' is not allowed in a constant expression}}
+#pragma omp allocate(a) align(c + 1)
+// expected-error@+1 {{expected an OpenMP directive}}
+#pragma omp align(2) allocate(a)
+// expected-error@+1 {{directive '#pragma omp allocate' cannot contain more than one 'align' clause}}
+#pragma omp allocate(a) align(2) align(4)
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
+#pragma omp allocate(a) align(9)
+// expected-error@+1 {{integral constant expression must have integral or unscoped enumeration type, not 'double'}}
+#pragma omp allocate(a) align(f)
+}
+
+// Verify appropriate errors when using templates.
+template 
+T run() {
+  T foo[size];
+// expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
+#pragma omp allocate(foo) align(align)
+  return foo[0];
+}
+
+int template_test() {
+  double d;
+  // expected-note@+1 {{in instantiation of function template specialization 'run' requested here}}
+  d = run();
+  return 0;
+}
Index: clang/test/OpenMP/align_clause_ast_print.cpp