summaryrefslogtreecommitdiffstats
path: root/source/slang/check.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/check.cpp')
-rw-r--r--source/slang/check.cpp172
1 files changed, 97 insertions, 75 deletions
diff --git a/source/slang/check.cpp b/source/slang/check.cpp
index ccc0fb087..4c73894c5 100644
--- a/source/slang/check.cpp
+++ b/source/slang/check.cpp
@@ -88,6 +88,10 @@ namespace Slang
CompileRequest* getCompileRequest() { return request; }
TranslationUnitRequest* getTranslationUnit() { return translationUnit; }
+ Session* getSession()
+ {
+ return getCompileRequest()->mSession;
+ }
public:
// Translate Types
@@ -107,7 +111,7 @@ namespace Slang
{
return typeType->type;
}
- return ExpressionType::Error;
+ return getSession()->getErrorType();
}
RefPtr<ExpressionType> TranslateTypeNode(const RefPtr<ExpressionSyntaxNode> & node)
{
@@ -214,7 +218,8 @@ namespace Slang
{
auto overloadedExpr = new OverloadedExpr();
overloadedExpr->Position = originalExpr->Position;
- overloadedExpr->Type = QualType(ExpressionType::Overloaded);
+ overloadedExpr->Type = QualType(
+ getSession()->getOverloadedType());
overloadedExpr->base = baseExpr;
overloadedExpr->lookupResult2 = lookupResult;
return overloadedExpr;
@@ -253,9 +258,9 @@ namespace Slang
getSink()->diagnose(item.declRef, Diagnostics::overloadCandidate, declString);
}
}
+
// TODO(tfoley): should we construct a new ErrorExpr here?
- overloadedExpr->Type = QualType(ExpressionType::Error);
- return overloadedExpr;
+ return CreateErrorExpr(overloadedExpr);
}
// otherwise, we had a single decl and it was valid, hooray!
@@ -273,7 +278,7 @@ namespace Slang
{
return expr;
}
- else if (expr->Type.type->Equals(ExpressionType::Error))
+ else if (auto errorType = expr->Type.type->As<ErrorType>())
{
return expr;
}
@@ -292,7 +297,7 @@ namespace Slang
{
return typeType->type;
}
- return ExpressionType::Error;
+ return getSession()->getErrorType();
}
RefPtr<ExpressionType> ExtractGenericArgType(RefPtr<ExpressionSyntaxNode> exp)
@@ -317,7 +322,7 @@ namespace Slang
{
return typeType->type;
}
- else if (exp->Type->Equals(ExpressionType::Error))
+ else if (auto errorType = exp->Type->As<ErrorType>())
{
return exp->Type.type;
}
@@ -332,7 +337,7 @@ namespace Slang
// The arguments should already be checked against
// the declaration.
RefPtr<ExpressionType> InstantiateGenericType(
- DeclRef<GenericDecl> genericDeclRef,
+ DeclRef<GenericDecl> genericDeclRef,
List<RefPtr<ExpressionSyntaxNode>> const& args)
{
RefPtr<Substitutions> subst = new Substitutions();
@@ -348,7 +353,9 @@ namespace Slang
innerDeclRef.decl = GetInner(genericDeclRef);
innerDeclRef.substitutions = subst;
- return DeclRefType::Create(innerDeclRef);
+ return DeclRefType::Create(
+ getSession(),
+ innerDeclRef);
}
// Make sure a declaration has been checked, so we can refer to it.
@@ -432,7 +439,7 @@ namespace Slang
{
getSink()->diagnose(typeExp.exp.Ptr(), Diagnostics::unimplemented, "can't fill in default for generic type parameter");
}
- *outProperType = ExpressionType::Error;
+ *outProperType = getSession()->getErrorType();
}
return false;
}
@@ -451,7 +458,7 @@ namespace Slang
{
getSink()->diagnose(typeExp.exp.Ptr(), Diagnostics::unimplemented, "can't fill in default for generic type parameter");
}
- *outProperType = ExpressionType::Error;
+ *outProperType = getSession()->getErrorType();
}
return false;
}
@@ -525,7 +532,7 @@ namespace Slang
{
getSink()->diagnose(result.exp.Ptr(), Diagnostics::invalidTypeVoid);
}
- result.type = ExpressionType::Error;
+ result.type = getSession()->getErrorType();
return result;
}
}
@@ -546,7 +553,7 @@ namespace Slang
RefPtr<ExpressionSyntaxNode> CreateErrorExpr(ExpressionSyntaxNode* expr)
{
- expr->Type = QualType(ExpressionType::Error);
+ expr->Type = QualType(getSession()->getErrorType());
return expr;
}
@@ -554,7 +561,7 @@ namespace Slang
{
// TODO: we may want other cases here...
- if (expr->Type->Equals(ExpressionType::Error))
+ if (auto errorType = expr->Type->As<ErrorType>())
return true;
return false;
@@ -1042,7 +1049,9 @@ namespace Slang
// clobber the type on `fromExpr`, and an invariant here is that coercion
// really shouldn't *change* the expression that is passed in, but should
// introduce new AST nodes to coerce its value to a different type...
- return CreateImplicitCastExpr(ExpressionType::Error, fromExpr);
+ return CreateImplicitCastExpr(
+ getSession()->getErrorType(),
+ fromExpr);
}
return expr;
}
@@ -1327,11 +1336,11 @@ namespace Slang
if (auto builtinMod = inner->FindModifier<BuiltinTypeModifier>())
{
- RegisterBuiltinDecl(decl, builtinMod);
+ registerBuiltinDecl(getSession(), decl, builtinMod);
}
if (auto magicMod = inner->FindModifier<MagicTypeModifier>())
{
- RegisterMagicDecl(decl, magicMod);
+ registerMagicDecl(getSession(), decl, magicMod);
}
}
@@ -1588,7 +1597,7 @@ namespace Slang
// TODO: This needs to bottleneck through the common variable checks
para->Type = CheckUsableType(para->Type);
- if (para->Type.Equals(ExpressionType::GetVoid()))
+ if (para->Type.Equals(getSession()->getVoidType()))
{
if (!isRewriteMode())
{
@@ -1707,7 +1716,7 @@ namespace Slang
{
RefPtr<ExpressionSyntaxNode> e = expr;
e = CheckTerm(e);
- e = Coerce(ExpressionType::GetBool(), e);
+ e = Coerce(getSession()->getBoolType(), e);
return e;
}
@@ -1749,7 +1758,7 @@ namespace Slang
{
PushOuterStmt(stmt);
- stmt->varDecl->Type.type = ExpressionType::GetInt();
+ stmt->varDecl->Type.type = getSession()->getIntType();
addModifier(stmt->varDecl, new ConstModifier());
RefPtr<IntVal> rangeBeginVal;
@@ -1851,7 +1860,7 @@ namespace Slang
{
if (!stmt->Expression)
{
- if (function && !function->ReturnType.Equals(ExpressionType::GetVoid()))
+ if (function && !function->ReturnType.Equals(getSession()->getVoidType()))
{
if (!isRewriteMode())
{
@@ -1862,7 +1871,7 @@ namespace Slang
else
{
stmt->Expression = CheckTerm(stmt->Expression);
- if (!stmt->Expression->Type->Equals(ExpressionType::Error.Ptr()))
+ if (!stmt->Expression->Type->Equals(getSession()->getErrorType()))
{
if (function)
{
@@ -1922,12 +1931,9 @@ namespace Slang
// Create a new array type based on the size we found,
// and install it into our type.
- auto newArrayType = new ArrayExpressionType();
- newArrayType->BaseType = arrayType->BaseType;
- newArrayType->ArrayLength = elementCount;
-
- // Okay we are good to go!
- varDecl->Type.type = newArrayType;
+ varDecl->Type.type = getArrayType(
+ arrayType->BaseType,
+ elementCount);
}
void ValidateArraySizeForVariable(Variable* varDecl)
@@ -1973,7 +1979,7 @@ namespace Slang
}
#endif
varDecl->Type = typeExp;
- if (varDecl->Type.Equals(ExpressionType::GetVoid()))
+ if (varDecl->Type.Equals(getSession()->getVoidType()))
{
if (!isRewriteMode())
{
@@ -2034,16 +2040,16 @@ namespace Slang
switch (expr->ConstType)
{
case ConstantExpressionSyntaxNode::ConstantType::Int:
- expr->Type = ExpressionType::GetInt();
+ expr->Type = getSession()->getIntType();
break;
case ConstantExpressionSyntaxNode::ConstantType::Bool:
- expr->Type = ExpressionType::GetBool();
+ expr->Type = getSession()->getBoolType();
break;
case ConstantExpressionSyntaxNode::ConstantType::Float:
- expr->Type = ExpressionType::GetFloat();
+ expr->Type = getSession()->getFloatType();
break;
default:
- expr->Type = QualType(ExpressionType::Error);
+ expr->Type = QualType(getSession()->getErrorType());
throw "Invalid constant type.";
break;
}
@@ -2273,7 +2279,7 @@ namespace Slang
// or NULL if the expression isn't recognized as a constant.
RefPtr<IntVal> TryCheckIntegerConstantExpression(ExpressionSyntaxNode* exp)
{
- if (!exp->Type.type->Equals(ExpressionType::GetInt()))
+ if (!exp->Type.type->Equals(getSession()->getIntType()))
{
return nullptr;
}
@@ -2288,7 +2294,7 @@ namespace Slang
RefPtr<IntVal> CheckIntegerConstantExpression(ExpressionSyntaxNode* inExpr)
{
// First coerce the expression to the expected type
- auto expr = Coerce(ExpressionType::GetInt(),inExpr);
+ auto expr = Coerce(getSession()->getIntType(),inExpr);
auto result = TryCheckIntegerConstantExpression(expr.Ptr());
if (!result)
{
@@ -2309,8 +2315,8 @@ namespace Slang
auto baseExpr = subscriptExpr->BaseExpression;
auto indexExpr = subscriptExpr->IndexExpression;
- if (!indexExpr->Type->Equals(ExpressionType::GetInt()) &&
- !indexExpr->Type->Equals(ExpressionType::GetUInt()))
+ if (!indexExpr->Type->Equals(getSession()->getIntType()) &&
+ !indexExpr->Type->Equals(getSession()->getUIntType()))
{
if (!isRewriteMode())
{
@@ -2341,7 +2347,9 @@ namespace Slang
RefPtr<ExpressionType> elementType,
RefPtr<IntVal> elementCount)
{
- auto vectorGenericDecl = findMagicDecl("Vector").As<GenericDecl>();
+ auto session = getSession();
+ auto vectorGenericDecl = findMagicDecl(
+ session, "Vector").As<GenericDecl>();
auto vectorTypeDecl = vectorGenericDecl->inner;
auto substitutions = new Substitutions();
@@ -2351,7 +2359,9 @@ namespace Slang
auto declRef = DeclRef<Decl>(vectorTypeDecl.Ptr(), substitutions);
- return DeclRefType::Create(declRef)->As<VectorExpressionType>();
+ return DeclRefType::Create(
+ session,
+ declRef)->As<VectorExpressionType>();
}
RefPtr<ExpressionSyntaxNode> visitIndexExpressionSyntaxNode(IndexExpressionSyntaxNode* subscriptExpr)
@@ -2388,12 +2398,12 @@ namespace Slang
}
auto elementType = CoerceToUsableType(TypeExp(baseExpr, baseTypeType->type));
- auto arrayType = new ArrayExpressionType();
- arrayType->BaseType = elementType.Ptr();
- arrayType->ArrayLength = elementCount;
+ auto arrayType = getArrayType(
+ elementType,
+ elementCount);
typeResult = arrayType;
- subscriptExpr->Type = new TypeType(arrayType);
+ subscriptExpr->Type = QualType(getTypeType(arrayType));
return subscriptExpr;
}
else if (auto baseArrayType = baseType->As<ArrayExpressionType>())
@@ -2433,7 +2443,9 @@ namespace Slang
// Note(tfoley): The name used for lookup here is a bit magical, since
// it must match what the parser installed in subscript declarations.
- LookupResult lookupResult = LookUpLocal(this, "operator[]", aggTypeDeclRef);
+ LookupResult lookupResult = LookUpLocal(
+ getSession(),
+ this, "operator[]", aggTypeDeclRef);
if (!lookupResult.isValid())
{
goto fail;
@@ -2553,7 +2565,7 @@ namespace Slang
}
}
}
- else if (decl->targetType->Equals(ExpressionType::Error))
+ else if (decl->targetType->Equals(getSession()->getErrorType()))
{
// there was an error, so ignore
}
@@ -3332,7 +3344,7 @@ namespace Slang
}
context.mode = OverloadResolveContext::Mode::ForReal;
- context.appExpr->Type = QualType(ExpressionType::Error);
+ context.appExpr->Type = QualType(getSession()->getErrorType());
if (!TryCheckOverloadCandidateArity(context, candidate))
goto error;
@@ -4002,7 +4014,9 @@ namespace Slang
}
else if (auto aggTypeDeclRef = item.declRef.As<AggTypeDecl>())
{
- auto type = DeclRefType::Create(aggTypeDeclRef);
+ auto type = DeclRefType::Create(
+ getSession(),
+ aggTypeDeclRef);
AddAggTypeOverloadCandidates(item, type, aggTypeDeclRef, context);
}
else if (auto genericDeclRef = item.declRef.As<GenericDecl>())
@@ -4359,7 +4373,7 @@ namespace Slang
{
getSink()->diagnose(expr->FunctionExpr, Diagnostics::expectedFunction);
}
- expr->Type = QualType(ExpressionType::Error);
+ expr->Type = QualType(getSession()->getErrorType());
return expr;
}
}
@@ -4577,9 +4591,11 @@ namespace Slang
if (expr->declRef)
return expr;
- expr->Type = QualType(ExpressionType::Error);
+ expr->Type = QualType(getSession()->getErrorType());
- auto lookupResult = LookUp(this, expr->name, expr->scope);
+ auto lookupResult = LookUp(
+ getSession(),
+ this, expr->name, expr->scope);
if (lookupResult.isValid())
{
return createLookupResultExpr(
@@ -4603,7 +4619,7 @@ namespace Slang
expr->TargetType = targetType;
// The way to perform casting depends on the types involved
- if (expr->Expression->Type->Equals(ExpressionType::Error.Ptr()))
+ if (expr->Expression->Type->Equals(getSession()->getErrorType()))
{
// If the expression being casted has an error type, then just silently succeed
expr->Type = targetType.Ptr();
@@ -4636,7 +4652,7 @@ namespace Slang
{
getSink()->diagnose(expr, Diagnostics::invalidTypeCast, expr->Expression->Type, targetType->ToString());
}
- expr->Type = QualType(ExpressionType::Error);
+ expr->Type = QualType(getSession()->getErrorType());
return expr;
}
@@ -4644,6 +4660,7 @@ namespace Slang
QualType GetTypeForDeclRef(DeclRef<Decl> declRef)
{
return getTypeForDeclRef(
+ getSession(),
this,
getSink(),
declRef,
@@ -4868,7 +4885,9 @@ namespace Slang
// Checking of the type must be complete before we can reference its members safely
EnsureDecl(aggTypeDeclRef.getDecl(), DeclCheckState::Checked);
- LookupResult lookupResult = LookUpLocal(this, expr->name, aggTypeDeclRef);
+ LookupResult lookupResult = LookUpLocal(
+ getSession(),
+ this, expr->name, aggTypeDeclRef);
if (!lookupResult.isValid())
{
goto fail;
@@ -4891,7 +4910,9 @@ namespace Slang
// Checking of the type must be complete before we can reference its members safely
EnsureDecl(aggTypeDeclRef.getDecl(), DeclCheckState::Checked);
- LookupResult lookupResult = LookUpLocal(this, expr->name, aggTypeDeclRef);
+ LookupResult lookupResult = LookUpLocal(
+ getSession(),
+ this, expr->name, aggTypeDeclRef);
if (!lookupResult.isValid())
{
goto fail;
@@ -4909,16 +4930,16 @@ namespace Slang
{
getSink()->diagnose(expr, Diagnostics::noMemberOfNameInType, expr->name, baseType);
}
- expr->Type = QualType(ExpressionType::Error);
+ expr->Type = QualType(getSession()->getErrorType());
return expr;
}
// All remaining cases assume we have a `BasicType`
else if (!baseType->AsBasicType())
- expr->Type = QualType(ExpressionType::Error);
+ expr->Type = QualType(getSession()->getErrorType());
else
- expr->Type = QualType(ExpressionType::Error);
- if (!baseType->Equals(ExpressionType::Error.Ptr()) &&
- expr->Type->Equals(ExpressionType::Error.Ptr()))
+ expr->Type = QualType(getSession()->getErrorType());
+ if (!baseType->Equals(getSession()->getErrorType()) &&
+ expr->Type->Equals(getSession()->getErrorType()))
{
if (!isRewriteMode())
{
@@ -4943,7 +4964,7 @@ namespace Slang
arg = CheckTerm(arg);
}
- expr->Type = ExpressionType::getInitializerListType();
+ expr->Type = getSession()->getInitializerListType();
return expr;
}
@@ -5028,9 +5049,10 @@ namespace Slang
// Get the type to use when referencing a declaration
QualType getTypeForDeclRef(
+ Session* session,
SemanticsVisitor* sema,
DiagnosticSink* sink,
- DeclRef<Decl> declRef,
+ DeclRef<Decl> declRef,
RefPtr<ExpressionType>* outTypeResult)
{
if( sema )
@@ -5049,47 +5071,47 @@ namespace Slang
}
else if (auto typeAliasDeclRef = declRef.As<TypeDefDecl>())
{
- auto type = new NamedExpressionType(typeAliasDeclRef);
+ auto type = getNamedType(session, typeAliasDeclRef);
*outTypeResult = type;
- return new TypeType(type);
+ return QualType(getTypeType(type));
}
else if (auto aggTypeDeclRef = declRef.As<AggTypeDecl>())
{
- auto type = DeclRefType::Create(aggTypeDeclRef);
+ auto type = DeclRefType::Create(session, aggTypeDeclRef);
*outTypeResult = type;
- return new TypeType(type);
+ return QualType(getTypeType(type));
}
else if (auto simpleTypeDeclRef = declRef.As<SimpleTypeDecl>())
{
- auto type = DeclRefType::Create(simpleTypeDeclRef);
+ auto type = DeclRefType::Create(session, simpleTypeDeclRef);
*outTypeResult = type;
- return new TypeType(type);
+ return QualType(getTypeType(type));
}
else if (auto genericDeclRef = declRef.As<GenericDecl>())
{
- auto type = new GenericDeclRefType(genericDeclRef);
+ auto type = getGenericDeclRefType(session, genericDeclRef);
*outTypeResult = type;
- return new TypeType(type);
+ return QualType(getTypeType(type));
}
else if (auto funcDeclRef = declRef.As<CallableDecl>())
{
- auto type = new FuncType();
- type->declRef = funcDeclRef;
- return type;
+ auto type = getFuncType(session, funcDeclRef);
+ return QualType(type);
}
if( sink )
{
sink->diagnose(declRef, Diagnostics::unimplemented, "cannot form reference to this kind of declaration");
}
- return QualType(ExpressionType::Error);
+ return QualType(session->getErrorType());
}
QualType getTypeForDeclRef(
- DeclRef<Decl> declRef)
+ Session* session,
+ DeclRef<Decl> declRef)
{
RefPtr<ExpressionType> typeResult;
- return getTypeForDeclRef(nullptr, nullptr, declRef, &typeResult);
+ return getTypeForDeclRef(session, nullptr, nullptr, declRef, &typeResult);
}
DeclRef<ExtensionDecl> ApplyExtensionToType(