Skip to content

Commit

Permalink
bind more type qualifiers
Browse files Browse the repository at this point in the history
  • Loading branch information
ltcmelo committed Apr 20, 2024
1 parent 442231a commit c3326a0
Show file tree
Hide file tree
Showing 9 changed files with 171 additions and 16 deletions.
4 changes: 2 additions & 2 deletions C/binder/ConstraintsInTypeSpecifiers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ void ConstraintsInTypeSpecifiers::specify(SyntaxToken builtTySpecTk,
}

BuiltinTypeKind ConstraintsInTypeSpecifiers::combine(SyntaxToken builtTySpecTk,
BuiltinTypeKind builtTyKind,
Binder::DiagnosticsReporter* diagReporter)
BuiltinTypeKind builtTyKind,
Binder::DiagnosticsReporter* diagReporter)
{
const auto tkK = builtTySpecTk.kind();
switch (builtTyKind) {
Expand Down
31 changes: 31 additions & 0 deletions C/binder/SemanticsOfTypeQualifiers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,22 @@
using namespace psy;
using namespace C;

const std::string SemanticsOfTypeQualifiers::ID_InvalidUseOfRestrict =
"Binder-300-6.7.3-2";

void SemanticsOfTypeQualifiers::InvalidUseOfRestrict(
SyntaxToken tyQualTk,
Binder::DiagnosticsReporter* diagReporter)
{
diagReporter->diagnose(DiagnosticDescriptor(
ID_InvalidUseOfRestrict,
"[[invalid use of restrict]]",
"invalid use of `restrict'",
DiagnosticSeverity::Error,
DiagnosticCategory::Binding),
tyQualTk);
}

void SemanticsOfTypeQualifiers::qualify(SyntaxToken tyQualTk,
TypeSymbol* tySym,
Binder::DiagnosticsReporter* diagReporter)
Expand All @@ -39,6 +55,21 @@ void SemanticsOfTypeQualifiers::qualify(SyntaxToken tyQualTk,
tySym->qualifyWithConst();
break;

case Keyword_volatile:
tySym->qualifyWithVolatile();
break;

case Keyword_restrict:
if (tySym->typeKind() == TypeKind::Pointer)
tySym->qualifyWithRestrict();
else
InvalidUseOfRestrict(tyQualTk, diagReporter);
break;

case Keyword__Atomic:
tySym->qualifyWithAtomic();
break;

default:
PSY_ESCAPE_VIA_BREAK;
}
Expand Down
8 changes: 8 additions & 0 deletions C/binder/SemanticsOfTypeQualifiers.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,18 @@ class Binder;

class PSY_C_NON_API SemanticsOfTypeQualifiers
{
friend class BinderTester;

public:
static void InvalidUseOfRestrict(SyntaxToken tyQualTk,
Binder::DiagnosticsReporter* diagReporter);

static void qualify(SyntaxToken tyQualTk,
TypeSymbol* tySym,
Binder::DiagnosticsReporter* diagReporter);

private:
static const std::string ID_InvalidUseOfRestrict;
};

} // C
Expand Down
10 changes: 10 additions & 0 deletions C/symbols/Symbol_Type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ bool TypeSymbol::isRestrictQualified() const
return P->BF_.restrict_;
}

bool TypeSymbol::isAtomicQualified() const
{
return P->BF_.atomic_;
}

void TypeSymbol::qualifyWithConst()
{
P->BF_.const_ = 1;
Expand All @@ -69,6 +74,11 @@ void TypeSymbol::qualifyWithRestrict()
P->BF_.restrict_ = 1;
}

void TypeSymbol::qualifyWithAtomic()
{
P->BF_.atomic_ = 1;
}

namespace psy {
namespace C {

Expand Down
12 changes: 9 additions & 3 deletions C/symbols/Symbol_Type.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,26 +78,32 @@ class PSY_C_API TypeSymbol : public Symbol
TypeKind typeKind() const;

/**
* Whether the type is \c const qualified.
* Whether \c this type is \c const qualified.
*/
bool isConstQualified() const;

/**
* Whether the type is \c volatile qualified.
* Whether \c this type is \c volatile qualified.
*/
bool isVolatileQualified() const;

/**
* Whether the type is \c restrict qualified.
* Whether \c this type is \c restrict qualified.
*/
bool isRestrictQualified() const;

/**
* Whether \c this type is \c _Atomic qualified.
*/
bool isAtomicQualified() const;

PSY_INTERNAL_AND_RESTRICTED:
PSY_GRANT_ACCESS(SemanticsOfTypeQualifiers);

void qualifyWithConst();
void qualifyWithVolatile();
void qualifyWithRestrict();
void qualifyWithAtomic();

protected:
DECL_PIMPL_SUB(TypeSymbol);
Expand Down
1 change: 1 addition & 0 deletions C/symbols/Symbol__IMPL__.inc
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ struct Symbol::SymbolImpl
std::uint16_t const_ : 1;
std::uint16_t volatile_ : 1;
std::uint16_t restrict_ : 1;
std::uint16_t atomic_ : 1;
};
union
{
Expand Down
104 changes: 93 additions & 11 deletions C/tests/BinderTester_1000_1999.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "ParserTester.h"

#include "binder/ConstraintsInTypeSpecifiers.h"
#include "binder/SemanticsOfTypeQualifiers.h"
#include "parser/Unparser.h"
#include "symbols/Symbol.h"
#include "symbols/Symbol_ALL.h"
Expand Down Expand Up @@ -274,11 +275,49 @@ void BinderTester::case1054()
.TySpec.basis("x", NamedTypeKind::Synonym, BuiltinTypeKind::UNSPECIFIED, CVR::Const)));
}

void BinderTester::case1055() {}
void BinderTester::case1056() {}
void BinderTester::case1057() {}
void BinderTester::case1058() {}
void BinderTester::case1059() {}
void BinderTester::case1055()
{
bind("int volatile x ;",
Expectation()
.binding(DeclSummary()
.Value("x", ValueKind::Variable)
.TySpec.basis("int", NamedTypeKind::Builtin, BuiltinTypeKind::Int, CVR::Volatile)));
}

void BinderTester::case1056()
{
bind("int volatile const x ;",
Expectation()
.binding(DeclSummary()
.Value("x", ValueKind::Variable)
.TySpec.basis("int", NamedTypeKind::Builtin, BuiltinTypeKind::Int, CVR::ConstAndVolatile)));
}

void BinderTester::case1057()
{
bind("int restrict x ;",
Expectation().diagnostic(
Expectation::ErrorOrWarn::Error,
SemanticsOfTypeQualifiers::ID_InvalidUseOfRestrict));
}

void BinderTester::case1058()
{
bind("int const restrict x ;",
Expectation().diagnostic(
Expectation::ErrorOrWarn::Error,
SemanticsOfTypeQualifiers::ID_InvalidUseOfRestrict));

}

void BinderTester::case1059()
{
bind("_Atomic int x ;",
Expectation()
.binding(DeclSummary().Value("x", ValueKind::Variable)
.TySpec.basis("int", NamedTypeKind::Builtin, BuiltinTypeKind::Int, CVR::Atomic)));
}

void BinderTester::case1060() {}
void BinderTester::case1061() {}
void BinderTester::case1062() {}
Expand Down Expand Up @@ -573,7 +612,10 @@ void BinderTester::case1151()
.TySpec.deriv(TypeKind::Pointer)));
}

void BinderTester::case1152() {}
void BinderTester::case1152()
{
}

void BinderTester::case1153() {}
void BinderTester::case1154() {}
void BinderTester::case1155() {}
Expand Down Expand Up @@ -632,9 +674,33 @@ void BinderTester::case1200()
.TySpec.deriv(TypeKind::Pointer, CVR::Const)));
}

void BinderTester::case1201() { }
void BinderTester::case1202() { }
void BinderTester::case1203() { }
void BinderTester::case1201()
{
bind("int const * restrict x ;",
Expectation()
.binding(DeclSummary().Value("x", ValueKind::Variable)
.TySpec.basis("int", NamedTypeKind::Builtin, BuiltinTypeKind::Int, CVR::Const)
.TySpec.deriv(TypeKind::Pointer, CVR::Restrict)));
}

void BinderTester::case1202()
{
bind("const int * restrict x ;",
Expectation()
.binding(DeclSummary().Value("x", ValueKind::Variable)
.TySpec.basis("int", NamedTypeKind::Builtin, BuiltinTypeKind::Int, CVR::Const)
.TySpec.deriv(TypeKind::Pointer, CVR::Restrict)));
}

void BinderTester::case1203()
{
bind("const int * const restrict x ;",
Expectation()
.binding(DeclSummary().Value("x", ValueKind::Variable)
.TySpec.basis("int", NamedTypeKind::Builtin, BuiltinTypeKind::Int, CVR::Const)
.TySpec.deriv(TypeKind::Pointer, CVR::ConstAndRestrict)));
}

void BinderTester::case1204() { }
void BinderTester::case1205() { }
void BinderTester::case1206() { }
Expand Down Expand Up @@ -700,8 +766,24 @@ void BinderTester::case1251()
.TySpec.deriv(TypeKind::Pointer, CVR::Const)));
}

void BinderTester::case1252() { }
void BinderTester::case1253() { }
void BinderTester::case1252()
{
bind("int * restrict x ;",
Expectation()
.binding(DeclSummary().Value("x", ValueKind::Variable)
.TySpec.basis("int", NamedTypeKind::Builtin, BuiltinTypeKind::Int, CVR::None)
.TySpec.deriv(TypeKind::Pointer, CVR::Restrict)));
}

void BinderTester::case1253()
{
bind("x * restrict y ;",
Expectation()
.binding(DeclSummary().Value("y", ValueKind::Variable)
.TySpec.basis("x", NamedTypeKind::Synonym, BuiltinTypeKind::UNSPECIFIED, CVR::None)
.TySpec.deriv(TypeKind::Pointer, CVR::Restrict)));
}

void BinderTester::case1254() { }
void BinderTester::case1255() { }
void BinderTester::case1256() { }
Expand Down
2 changes: 2 additions & 0 deletions C/tests/TestExpectation.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ enum class CVR
Volatile,
Restrict,
ConstAndVolatile,
ConstAndRestrict,
Atomic,
None
};

Expand Down
15 changes: 15 additions & 0 deletions C/tests/TestSuite_Internals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,21 @@ bool CVRMatches(const TypeSymbol* tySym, CVR cvr)
}
break;

case CVR::ConstAndRestrict:
if (!(tySym->isConstQualified())
|| !(tySym->isRestrictQualified())) {
DETAIL_MISMATCH("missing const restrict");
return false;
}
break;

case CVR::Atomic:
if (!tySym->isAtomicQualified()) {
DETAIL_MISMATCH("missing _Atomic");
return false;
}
break;

case CVR::None:
if (tySym->isConstQualified()) {
DETAIL_MISMATCH("spurious const");
Expand Down

0 comments on commit c3326a0

Please sign in to comment.