[cfe-commits] r62003 - in /cfe/trunk: include/clang/AST/Decl.h include/clang/Basic/DiagnosticKinds.def lib/Sema/SemaDeclCXX.cpp test/SemaCXX/virtuals.cpp
Douglas Gregor
dgregor at apple.com
Fri Jan 9 13:02:01 PST 2009
On Jan 9, 2009, at 11:57 AM, Sebastian Redl wrote:
> Author: cornedbee
> Date: Fri Jan 9 13:57:06 2009
> New Revision: 62003
>
> URL: http://llvm.org/viewvc/llvm-project?rev=62003&view=rev
> Log:
> Very basic support for pure virtual functions.
Thanks!
> Added:
> cfe/trunk/test/SemaCXX/virtuals.cpp
> Modified:
> cfe/trunk/include/clang/AST/Decl.h
> cfe/trunk/include/clang/Basic/DiagnosticKinds.def
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>
> Modified: cfe/trunk/include/clang/AST/Decl.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=62003&r1=62002&r2=62003&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/AST/Decl.h (original)
> +++ cfe/trunk/include/clang/AST/Decl.h Fri Jan 9 13:57:06 2009
> @@ -648,6 +648,8 @@
> // NOTE: VC++ treats enums as signed, avoid using the StorageClass
> enum
> unsigned SClass : 2;
> bool IsInline : 1;
> + bool IsVirtual : 1;
> + bool IsPure : 1;
>
> // Move to DeclGroup when it is implemented.
> SourceLocation TypeSpecStartLoc;
> @@ -659,7 +661,8 @@
> : ValueDecl(DK, DC, L, N, T, PrevDecl),
> DeclContext(DK),
> ParamInfo(0), Body(0), PreviousDeclaration(0),
> - SClass(S), IsInline(isInline), TypeSpecStartLoc(TSSL) {}
> + SClass(S), IsInline(isInline), IsVirtual(false), IsPure(false),
> + TypeSpecStartLoc(TSSL) {}
>
> virtual ~FunctionDecl();
> virtual void Destroy(ASTContext& C);
> @@ -692,7 +695,13 @@
> bool isThisDeclarationADefinition() const { return Body != 0; }
>
> void setBody(Stmt *B) { Body = B; }
> -
> +
> + bool isVirtual() { return IsVirtual; }
> + void setVirtual() { IsVirtual = true; }
> +
> + bool isPure() { return IsPure; }
> + void setPure() { IsPure = true; }
> +
Could you add some documentation for these? Just a sentence or two
would suffice.
> + // not static member. perhaps virtual function?
> + if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Member)) {
> + IntegerLiteral *IL;
> + if ((IL = dyn_cast<IntegerLiteral>(Init)) && IL->getValue()
> == 0 &&
> + Context.getCanonicalType(IL->getType()) ==
> Context.IntTy) {
I'm not so sure about this. Can't the parser parse a pure-specifier
differently from a normal initializer, so it can check for '= 0'
rather than having semantical analysis try to dissect an already-
analyzed expression? We'll need to handle this kind of syntax on the
parser anyway to deal with C++0x's "= delete" and "= default".
- Doug
More information about the cfe-commits
mailing list