Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions clang/include/clang/Basic/DiagnosticParseKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -1817,5 +1817,7 @@ def ext_hlsl_access_specifiers : ExtWarn<
InGroup<HLSLExtension>;
def err_hlsl_unsupported_component : Error<"invalid component '%0' used; expected 'x', 'y', 'z', or 'w'">;
def err_hlsl_packoffset_invalid_reg : Error<"invalid resource class specifier '%0' for packoffset, expected 'c'">;
def err_hlsl_virtual_function : Error<"virtual functions are unsupported in HLSL">;
def err_hlsl_virtual_inheritance : Error<"virtual inheritance is unsupported in HLSL">;

} // end of Parser diagnostics
7 changes: 6 additions & 1 deletion clang/lib/Parse/ParseDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4411,7 +4411,12 @@ void Parser::ParseDeclarationSpecifiers(
DiagID = diag::err_openclcxx_virtual_function;
PrevSpec = Tok.getIdentifierInfo()->getNameStart();
isInvalid = true;
} else {
} else if (getLangOpts().HLSL) {
DiagID = diag::err_hlsl_virtual_function;
PrevSpec = Tok.getIdentifierInfo()->getNameStart();
isInvalid = true;
}
else {
isInvalid = DS.setFunctionSpecVirtual(Loc, PrevSpec, DiagID);
}
break;
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/Parse/ParseDeclCXX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2491,6 +2491,9 @@ BaseResult Parser::ParseBaseSpecifier(Decl *ClassDecl) {
IsVirtual = true;
}

if (getLangOpts().HLSL && IsVirtual)
Diag(Tok.getLocation(), diag::err_hlsl_virtual_inheritance);

CheckMisplacedCXX11Attribute(Attributes, StartLoc);

// Parse the class-name.
Expand Down
14 changes: 14 additions & 0 deletions clang/test/SemaHLSL/Language/NoVirtual.hlsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -verify %s

struct Base {
int X;
void MemberFunction(); // valid
virtual void MemberFunction2(); // expected-error{{virtual functions are unsupported in HLSL}}
};

struct Derived : virtual Base { // expected-error{{virtual inheritance is unsupported in HLSL}}
int Y;

void MemberFunction2() override; // expected-error{{only virtual member functions can be marked 'override'}}
};

Loading