Commit my WIP on constexpr support. This commit: an XFAILed test and treating constexpr as a top-level const.

llvm-svn: 105752
This commit is contained in:
Sebastian Redl 2010-06-09 21:19:43 +00:00
parent 243d9057d0
commit c3eba8f547
2 changed files with 84 additions and 1 deletions

View File

@ -860,7 +860,7 @@ QualType Sema::BuildMemberPointerType(QualType T, QualType Class,
T = Context.getCanonicalType(T);
}
// C++ 8.3.3p3: A pointer to member shall not pointer to ... a member
// C++ 8.3.3p3: A pointer to member shall not point to ... a member
// with reference type, or "cv void."
if (T->isReferenceType()) {
Diag(Loc, diag::err_illegal_decl_mempointer_to_reference)
@ -1335,6 +1335,11 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
}
}
// If there's a constexpr specifier, treat it as a top-level const.
if (D.getDeclSpec().isConstexprSpecified()) {
T.addConst();
}
// Process any function attributes we might have delayed from the
// declaration-specifiers.
ProcessDelayedFnAttrs(*this, T, FnAttrsFromDeclSpec);

View File

@ -0,0 +1,78 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// XFAIL: *
struct notlit {
notlit() {}
};
struct notlit2 {
notlit2() {}
};
// valid declarations
constexpr int i1 = 0;
constexpr int f1() { return 0; }
struct s1 {
constexpr static int mi = 0;
};
// invalid declarations
// not a definition of an object
constexpr extern int i2; // x
// not a literal type
constexpr notlit nl1; // x
// function parameters
void f2(constexpr int i) {} // x
// non-static member
struct s2 {
constexpr int mi; // x
};
// redeclaration mismatch
constexpr int f3(); // n
int f3(); // x
int f4(); // n
constexpr int f4(); // x
// template stuff
template <typename T>
constexpr T ft(T t) { return t; }
// specialization can differ in constepxr
template <>
notlit ft(notlit nl) { return nl; }
constexpr int i3 = ft(1);
void test() {
// ignore constexpr when instantiating with non-literal
notlit2 nl2;
(void)ft(nl2);
}
// Examples from the standard:
constexpr int square(int x);
constexpr int bufsz = 1024;
constexpr struct pixel { // x
int x;
int y;
constexpr pixel(int);
};
constexpr pixel::pixel(int a)
: x(square(a)), y(square(a))
{ }
constexpr pixel small(2); // x (no definition of square(int) yet, so can't
// constexpr-eval pixel(int))
constexpr int square(int x) {
return x * x;
}
constexpr pixel large(4); // now valid
int next(constexpr int x) { // x
return x + 1;
}
extern constexpr int memsz; // x