[cfe-commits] r82093 - in /cfe/trunk: lib/AST/ASTContext.cpp lib/Sema/Sema.h lib/Sema/SemaType.cpp test/CXX/dcl.decl/dcl.meaning/dcl.fct/p3.cpp

Anders Carlsson andersca at mac.com
Wed Sep 16 16:47:08 PDT 2009


Author: andersca
Date: Wed Sep 16 18:47:08 2009
New Revision: 82093

URL: http://llvm.org/viewvc/llvm-project?rev=82093&view=rev
Log:
When creating function types, remove any top-level CVR qualifications in the function type argument types.

Added:
    cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p3.cpp
Modified:
    cfe/trunk/lib/AST/ASTContext.cpp
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaType.cpp

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=82093&r1=82092&r2=82093&view=diff

==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Wed Sep 16 18:47:08 2009
@@ -1643,6 +1643,12 @@
                                      unsigned TypeQuals, bool hasExceptionSpec,
                                      bool hasAnyExceptionSpec, unsigned NumExs,
                                      const QualType *ExArray, bool NoReturn) {
+  if (LangOpts.CPlusPlus) {
+    for (unsigned i = 0; i != NumArgs; ++i)
+      assert(!ArgArray[i].getCVRQualifiers() && 
+             "C++ arguments can't have toplevel CVR qualifiers!");
+  }
+  
   // Unique functions, to guarantee there is only one function of a particular
   // structure.
   llvm::FoldingSetNodeID ID;

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=82093&r1=82092&r2=82093&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Wed Sep 16 18:47:08 2009
@@ -3605,6 +3605,19 @@
   void DiagnoseMissingMember(SourceLocation MemberLoc, DeclarationName Member,
                              NestedNameSpecifier *NNS, SourceRange Range);
 
+  /// adjustFunctionParamType - Converts the type of a function parameter to a
+  // type that can be passed as an argument type to
+  /// ASTContext::getFunctionType.
+  ///
+  /// C++ [dcl.fct]p3: "...Any cv-qualifier modifying a parameter type is
+  /// deleted. Such cv-qualifiers affect only the definition of the parameter 
+  /// within the body of the function; they do not affect the function type. 
+  QualType adjustFunctionParamType(QualType T) const {
+    if (!Context.getLangOptions().CPlusPlus)
+      return T;
+
+    return T.getUnqualifiedType();
+  }
   //===--------------------------------------------------------------------===//
   // Extra semantic analysis beyond the C type system
 private:

Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=82093&r1=82092&r2=82093&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Wed Sep 16 18:47:08 2009
@@ -692,7 +692,7 @@
       Invalid = true;
     }
 
-    ParamTypes[Idx] = ParamType;
+    ParamTypes[Idx] = adjustFunctionParamType(ParamType);
   }
 
   if (Invalid)
@@ -1020,8 +1020,11 @@
 
         for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) {
           ParmVarDecl *Param = FTI.ArgInfo[i].Param.getAs<ParmVarDecl>();
-          if (Param)
-            ArgTys.push_back(Param->getType());
+          if (Param) {
+            QualType ArgTy = adjustFunctionParamType(Param->getType());
+
+            ArgTys.push_back(ArgTy);
+          }
         }
         SourceTy = Context.getFunctionType(SourceTy, ArgTys.data(),
                                            ArgTys.size(),
@@ -1144,7 +1147,7 @@
             }
           }
 
-          ArgTys.push_back(ArgTy);
+          ArgTys.push_back(adjustFunctionParamType(ArgTy));
         }
 
         llvm::SmallVector<QualType, 4> Exceptions;

Added: cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p3.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p3.cpp?rev=82093&view=auto

==============================================================================
--- cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p3.cpp (added)
+++ cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p3.cpp Wed Sep 16 18:47:08 2009
@@ -0,0 +1,3 @@
+// RUN: clang-cc -fsyntax-only -verify %s 
+void f(int) { } // expected-note {{previous definition is here}}
+void f(const int) { } // expected-error {{redefinition of 'f'}}
\ No newline at end of file





More information about the cfe-commits mailing list