Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
[Sema] __is_constructible should return false for function types
Browse files Browse the repository at this point in the history
While functions types are complete, they cannot be constructed.

This fixes PR25513.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@253013 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
majnemer committed Nov 13, 2015
1 parent 2a18752 commit 4f15f7f
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 10 deletions.
21 changes: 11 additions & 10 deletions lib/Sema/SemaExprCXX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4084,26 +4084,27 @@ static bool evaluateTypeTrait(Sema &S, TypeTrait Kind, SourceLocation KWLoc,
return false;
}

// Make sure the first argument is a complete type.
if (Args[0]->getType()->isIncompleteType())
// Make sure the first argument is not incomplete nor a function type.
QualType T = Args[0]->getType();
if (T->isIncompleteType() || T->isFunctionType())
return false;

// Make sure the first argument is not an abstract type.
CXXRecordDecl *RD = Args[0]->getType()->getAsCXXRecordDecl();
CXXRecordDecl *RD = T->getAsCXXRecordDecl();
if (RD && RD->isAbstract())
return false;

SmallVector<OpaqueValueExpr, 2> OpaqueArgExprs;
SmallVector<Expr *, 2> ArgExprs;
ArgExprs.reserve(Args.size() - 1);
for (unsigned I = 1, N = Args.size(); I != N; ++I) {
QualType T = Args[I]->getType();
if (T->isObjectType() || T->isFunctionType())
T = S.Context.getRValueReferenceType(T);
QualType ArgTy = Args[I]->getType();
if (ArgTy->isObjectType() || ArgTy->isFunctionType())
ArgTy = S.Context.getRValueReferenceType(ArgTy);
OpaqueArgExprs.push_back(
OpaqueValueExpr(Args[I]->getTypeLoc().getLocStart(),
T.getNonLValueExprType(S.Context),
Expr::getValueKindForType(T)));
OpaqueValueExpr(Args[I]->getTypeLoc().getLocStart(),
ArgTy.getNonLValueExprType(S.Context),
Expr::getValueKindForType(ArgTy)));
}
for (Expr &E : OpaqueArgExprs)
ArgExprs.push_back(&E);
Expand Down Expand Up @@ -4134,7 +4135,7 @@ static bool evaluateTypeTrait(Sema &S, TypeTrait Kind, SourceLocation KWLoc,
// Under Objective-C ARC, if the destination has non-trivial Objective-C
// lifetime, this is a non-trivial construction.
if (S.getLangOpts().ObjCAutoRefCount &&
hasNontrivialObjCLifetime(Args[0]->getType().getNonReferenceType()))
hasNontrivialObjCLifetime(T.getNonReferenceType()))
return false;

// The initialization succeeded; now make sure there are no non-trivial
Expand Down
3 changes: 3 additions & 0 deletions test/SemaCXX/type-traits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1991,6 +1991,9 @@ void constructible_checks() {
// PR20228
{ int arr[T(__is_constructible(VariadicCtor,
int, int, int, int, int, int, int, int, int))]; }

// PR25513
{ int arr[F(__is_constructible(int(int)))]; }
}

// Instantiation of __is_trivially_constructible
Expand Down

0 comments on commit 4f15f7f

Please sign in to comment.