@@ -2993,6 +2993,11 @@ void DiagnoseHLSLAvailability::HandleFunctionOrMethodRef(FunctionDecl *FD,
29932993
29942994void DiagnoseHLSLAvailability::RunOnTranslationUnit (
29952995 const TranslationUnitDecl *TU ) {
2996+ const TargetInfo &TargetInfo = SemaRef.getASTContext ().getTargetInfo ();
2997+ std::string &EntryName = TargetInfo.getTargetOpts ().HLSLEntry ;
2998+ bool IsLibraryShader = TargetInfo.getTriple ().getEnvironment () ==
2999+ llvm::Triple::EnvironmentType::Library;
3000+ SourceLocation EntryLoc{};
29963001
29973002 // Iterate over all shader entry functions and library exports, and for those
29983003 // that have a body (definiton), run diag scan on each, setting appropriate
@@ -3023,6 +3028,17 @@ void DiagnoseHLSLAvailability::RunOnTranslationUnit(
30233028
30243029 // shader entry point
30253030 if (HLSLShaderAttr *ShaderAttr = FD ->getAttr <HLSLShaderAttr>()) {
3031+ if (!IsLibraryShader && FD ->getName () == EntryName) {
3032+ if (EntryLoc.isValid ()) {
3033+ SemaRef.Diag (FD ->getLocation (),
3034+ diag::err_hlsl_ambiguous_entry_point)
3035+ << EntryName;
3036+ SemaRef.Diag (EntryLoc, diag::note_previous_declaration_as)
3037+ << EntryName;
3038+ return ;
3039+ }
3040+ EntryLoc = FD ->getLocation ();
3041+ }
30263042 SetShaderStageContext (ShaderAttr->getType ());
30273043 RunOnFunction (FD );
30283044 continue ;
@@ -3046,6 +3062,12 @@ void DiagnoseHLSLAvailability::RunOnTranslationUnit(
30463062 }
30473063 }
30483064 }
3065+
3066+ if (!IsLibraryShader && EntryLoc.isInvalid ()) {
3067+ SemaRef.Diag (TU ->getLocation (), diag::err_hlsl_missing_entry_point)
3068+ << EntryName;
3069+ return ;
3070+ }
30493071}
30503072
30513073void DiagnoseHLSLAvailability::RunOnFunction (const FunctionDecl *FD ) {
0 commit comments