summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp5
-rw-r--r--clang/lib/Sema/SemaExpr.cpp14
-rw-r--r--clang/lib/Sema/SemaType.cpp15
3 files changed, 11 insertions, 23 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 2d0251cc144..e247e2a52c5 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1014,10 +1014,9 @@ Sema::ActOnParamDeclarator(struct DeclaratorChunk::ParamInfo &PI,
// we need to consider storing both types (in ParmVarDecl)...
//
QualType parmDeclType = QualType::getFromOpaquePtr(PI.TypeInfo);
- if (const ArrayType *AT = parmDeclType->getAsArrayType()) {
+ if (parmDeclType->isArrayType()) {
// int x[restrict 4] -> int *restrict
- parmDeclType = Context.getPointerType(AT->getElementType());
- parmDeclType = parmDeclType.getQualifiedType(AT->getIndexTypeQualifier());
+ parmDeclType = Context.getArrayDecayedType(parmDeclType);
} else if (parmDeclType->isFunctionType())
parmDeclType = Context.getPointerType(parmDeclType);
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index f57ad2df9c7..1cd23522e8f 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -932,18 +932,8 @@ void Sema::DefaultFunctionArrayConversion(Expr *&E) {
}
if (Ty->isFunctionType())
ImpCastExprToType(E, Context.getPointerType(Ty));
- else if (const ArrayType *ArrayTy = Ty->getAsArrayType()) {
- // Make sure we don't lose qualifiers when dealing with typedefs. Example:
- // typedef int arr[10];
- // void test2() {
- // const arr b;
- // b[4] = 1;
- // }
- QualType ELT = ArrayTy->getElementType();
- // FIXME: Handle ASQualType
- ELT = ELT.getQualifiedType(Ty.getCVRQualifiers()|ELT.getCVRQualifiers());
- ImpCastExprToType(E, Context.getPointerType(ELT));
- }
+ else if (Ty->isArrayType())
+ ImpCastExprToType(E, Context.getArrayDecayedType(Ty));
}
/// UsualUnaryConversions - Performs various conversions that are common to most
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index ad9d138f91b..5874477de1a 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -317,18 +317,17 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) {
// type in ParmVarDecl (which makes the code generator unhappy).
//
// FIXME: We still apparently need the conversion in
- // Sema::ParseParamDeclarator(). This doesn't make any sense, since
+ // Sema::ActOnParamDeclarator(). This doesn't make any sense, since
// it should be driving off the type being created here.
//
// FIXME: If a source translation tool needs to see the original type,
// then we need to consider storing both types somewhere...
//
- if (const ArrayType *AT = ArgTy->getAsArrayType()) {
- // int x[restrict 4] -> int *restrict
- ArgTy = Context.getPointerType(AT->getElementType());
- ArgTy = ArgTy.getQualifiedType(AT->getIndexTypeQualifier());
+ if (ArgTy->isArrayType()) {
+ ArgTy = Context.getArrayDecayedType(ArgTy);
} else if (ArgTy->isFunctionType())
ArgTy = Context.getPointerType(ArgTy);
+
// Look for 'void'. void is allowed only as a single argument to a
// function with no other parameters (C99 6.7.5.3p10). We record
// int(void) as a FunctionTypeProto with an empty argument list.
@@ -391,9 +390,9 @@ QualType Sema::ObjCGetTypeForMethodDefinition(DeclTy *D) {
assert(!ArgTy.isNull() && "Couldn't parse type?");
// Perform the default function/array conversion (C99 6.7.5.3p[7,8]).
// This matches the conversion that is done in
- // Sema::ParseParamDeclarator().
- if (const ArrayType *AT = ArgTy->getAsArrayType())
- ArgTy = Context.getPointerType(AT->getElementType());
+ // Sema::ActOnParamDeclarator().
+ if (ArgTy->isArrayType())
+ ArgTy = Context.getArrayDecayedType(ArgTy);
else if (ArgTy->isFunctionType())
ArgTy = Context.getPointerType(ArgTy);
ArgTys.push_back(ArgTy);
OpenPOWER on IntegriCloud