summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2008-05-07 04:49:29 +0000
committerDouglas Gregor <dgregor@apple.com>2008-05-07 04:49:29 +0000
commitcaa8acebe738aaa17fcbaa99b3f39da7874a6063 (patch)
tree3783ae6afce1b29c8f024d726bb41ca7951f57a7 /clang/lib/Sema/SemaDeclCXX.cpp
parent9930bd8c4f778145c97a8baa2e6d0311cfa89e2e (diff)
downloadbcm5719-llvm-caa8acebe738aaa17fcbaa99b3f39da7874a6063.tar.gz
bcm5719-llvm-caa8acebe738aaa17fcbaa99b3f39da7874a6063.zip
Diagnose attempts to use C++ default arguments outside of a function declaration
llvm-svn: 50799
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp36
1 files changed, 28 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 827c737ad4a..c3b6bce447a 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -134,14 +134,6 @@ Sema::ActOnParamDefaultArgument(DeclTy *param, SourceLocation EqualLoc,
return;
}
- // FIXME: C++ [dcl.fct.default]p3
- // A default argument expression shall be specified only in the
- // parameter-declaration-clause of a function declaration or in a
- // template-parameter (14.1). It shall not be specified for a
- // parameter pack. If it is specified in a
- // parameter-declaration-clause, it shall not occur within a
- // declarator or abstract-declarator of a parameter-declaration.
-
// Check that the default argument is well-formed
CheckDefaultArgumentVisitor DefaultArgChecker(DefaultArg.get(), this);
if (DefaultArgChecker.Visit(DefaultArg.get()))
@@ -151,6 +143,34 @@ Sema::ActOnParamDefaultArgument(DeclTy *param, SourceLocation EqualLoc,
Param->setDefaultArg(DefaultArg.take());
}
+/// CheckExtraCXXDefaultArguments - Check for any extra default
+/// arguments in the declarator, which is not a function declaration
+/// or definition and therefore is not permitted to have default
+/// arguments. This routine should be invoked for every declarator
+/// that is not a function declaration or definition.
+void Sema::CheckExtraCXXDefaultArguments(Declarator &D) {
+ // C++ [dcl.fct.default]p3
+ // A default argument expression shall be specified only in the
+ // parameter-declaration-clause of a function declaration or in a
+ // template-parameter (14.1). It shall not be specified for a
+ // parameter pack. If it is specified in a
+ // parameter-declaration-clause, it shall not occur within a
+ // declarator or abstract-declarator of a parameter-declaration.
+ for (unsigned i = 0; i < D.getNumTypeObjects(); ++i) {
+ DeclaratorChunk &chunk = D.getTypeObject(i);
+ if (chunk.Kind == DeclaratorChunk::Function) {
+ for (unsigned argIdx = 0; argIdx < chunk.Fun.NumArgs; ++argIdx) {
+ ParmVarDecl *Param = (ParmVarDecl *)chunk.Fun.ArgInfo[argIdx].Param;
+ if (Param->getDefaultArg()) {
+ Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc,
+ Param->getDefaultArg()->getSourceRange());
+ Param->setDefaultArg(0);
+ }
+ }
+ }
+ }
+}
+
// MergeCXXFunctionDecl - Merge two declarations of the same C++
// function, once we already know that they have the same
// type. Subroutine of MergeFunctionDecl.
OpenPOWER on IntegriCloud